#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstring>
#include<string>
#include<algorithm>
using namespace std;
struct point{
int x,y,step;
int tar;
int cnt;
};
int n,m;
int ex,ey;
int dx[5]={1,-1,0,0,0};
int dy[5]={0,0,1,-1,0};
point q[2000005];
bool a[105][105];//1--障碍,0--空地
bool used[105][105][4][7];
int main(){
ios::sync_with_stdio(0);
cin.tie(0);
cin>>n>>m>>q[1].x>>q[1].y>>ex>>ey;
q[1].step=0,q[1].tar=0,q[1].cnt=0;
q[2]=q[1],q[3]=q[1],q[4]=q[1];
q[2].tar=1,q[3].tar=2,q[4].tar=3;
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
int tmp;
cin>>tmp;
a[i][j]=(bool)(tmp==0);
}
}
for(int K=1;K<=10;K++){
int f=1,e=4;
memset(used,0,sizeof(used));
bool flag=0;
while(f<=e){
point u=q[f];
f++;
bool cou=(bool)(u.cnt>=K);
if(u.x<1||u.x>n||u.y<1||u.y>m||used[u.x][u.y][(int)cou][u.tar]==1||a[u.x][u.y]==1)continue;
used[u.x][u.y][(int)cou][u.tar]=1;
if(u.x==ex&&u.y==ey){
cout<<K<<" "<<u.step<<"\n";
flag=1;
break;
}
e++;
q[e].x=u.x+dx[u.tar],q[e].y=u.y+dy[u.tar],q[e].step=u.step+1,q[e].cnt=u.cnt+1,q[e].tar=u.tar;
if(u.cnt>=K){
u.cnt=0;
for(int i=0;i<4;i++){
if(i==u.tar)continue;
e++;
q[e].x=u.x+dx[i],q[e].y=u.y+dy[i],q[e].step=u.step+1,q[e].cnt=u.cnt+1,q[e].tar=i;
}
}
}
if(flag==0)break;
}
return 0;
}
主要思路就是bfs,里面记录了x,y坐标、走了几步(step),现在的方向(tar),在这个方向上走了几步(cnt),
都定义在那个结构体里
然后used就是判断有无走过重复情况,四个下标分别是x,y坐标、能否转向(cou),方向