我的思路是记录拐弯点 还有方向 但是wa了,我觉得大致思路是对的。我先贴出来 最近忙 没有时间改 他们说dfs比较简单 但我还是习惯用bfs做
#include<iostream>
#include<cstdio>
#include<cstring>
#include<string.h>
#include<queue>
using namespace std;
int n,m,q,maze[1010][1010],vis[1010][1010];
int x1,y1,x2,y2,r;
int dx[]={1,0,-1,0};
int dy[]={0,1,0,-1};
struct node
{
int x;
int y;
int k;
int dir;
};
int bfs(int c,int d)
{node a,b;
queue<node>que;
a.x=c;a.y=d;a.k=0;a.dir=-1;
que.push(a);
while(que.size())
{
a=que.front();
que.pop();
if(a.x==x2&&a.y==y2&&a.k<=2)
{//cout<<" ss"<<a.k<<endl;
return 1;
}
for(int i=0;i<4;i++)
{
b.x=a.x+dx[i];
b.y=a.y+dy[i];
b.dir=a.dir;
b.k=a.k;
if(b.dir==-1)
{
b.dir=i;
}
else if(b.dir!=i)
{
b.k=a.k+1;
b.dir=i;
}
if(b.x>=0&&b.x<n&&b.y>=0&&b.y<m&&maze[b.x][b.y]==0&&vis[b.x][b.y]==0&&b.k<=2)
{
vis[b.x][b.y]=1;
que.push(b);
}
}
}
return -1;
}
int main()
{
while(scanf("%d%d",&n,&m)!=EOF&&n&&m)
{
for(int i=0;i<n;i++)
{
for(int j=0;j<m;j++)
scanf("%d",&maze[i][j]);
}
scanf("%d",&q);
for(int i=0;i<q;i++)
{
scanf("%d%d%d%d",&x1,&y1,&x2,&y2);
x1=x1-1;x2=x2-1;y1=y1-1;y2=y2-1;
if(maze[x1][y1]!=maze[x2][y2])
{cout<<"NO"<<endl;
continue;
}
if(maze[x1][y1]==0||maze[x2][y2]==0)
{cout<<"NO"<<endl;
continue;
}
if(x1==x2&&y1==y2)
{cout<<"NO"<<endl;
continue;
}
r=maze[x2][y2];
maze[x2][y2]=0;
memset(vis,0,sizeof(vis));
if(bfs(x1,y1)>0)
{
cout<<"YES"<<endl;
}
else
{
cout<<"NO"<<endl;
}
maze[x2][y2]=r;
}
}
return 0;
}