看别人代码都看了好久,智商不够用
#include<stdio.h>
#include<string.h>
#include<queue>
using namespace std;
int stj,sti,endi,endj;
int d[4][2]={0,1,0,-1,1,0,-1,0};
int m,n,v[1005][1005],map[1005][1005];
struct node
{
int x,y,dir,step;
}start;
void bfs()
{
int i,a,b;
node pre,cur;
start.x=sti;start.y=stj;
v[sti][stj]=0;
start.dir=-1;
start.step=0;
start.step=0;
queue<node>q;
q.push(start);
while(!q.empty())
{
pre=q.front();
q.pop();
if(pre.x==endi&&pre.y==endj)
{
printf("YES\n");
return ;
}
for(i=0;i<4;i++)
{
a=cur.x=pre.x+d[i][0];
b=cur.y=pre.y+d[i][1];
if(pre.dir==-1)//判断是不是刚开始(第一步)
{
cur.step=0;
cur.dir=i;
}
else if(pre.dir!=i)//方向改变了
{
cur.dir=i;
cur.step=pre.step+1;
}
else //方向不变
{
cur.dir=pre.dir;
cur.step=pre.step;
}
if(a<1||b<1||a>n||b>m||map[a][b]&&!(a==endi&&b==endj)||cur.step>2)
continue;
if(v[a][b]>cur.step)
{
v[a][b]=cur.step;
q.push(cur);
}
}
}
printf("NO\n");
}
int main()
{
int i,j,t;
while(scanf("%d%d",&n,&m),n+m)
{
for(i=1;i<=n;i++)
{
for(j=1;j<=m;j++)
scanf("%d",&map[i][j]);
}
scanf("%d",&t);
while(t--)
{
scanf("%d%d%d%d",&sti,&stj,&endi,&endj);
if(sti==endi&&stj==endj)
{
printf("NO\n");
continue;
}
if(map[sti][stj]!=map[endi][endj]||map[sti][stj]+map[endi][endj]==0)
{
printf("NO\n");
continue;
}
for(i=1;i<=n;i++)
{
for(j=1;j<=m;j++)
v[i][j]=3;
}
bfs();
}
}
return 0;
}