题目链接:hdu1175
BFS和DFS都可以解决这道题目
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<queue>
#define MAXN 1005
using namespace std;
int map[MAXN][MAXN],v[MAXN][MAXN];
const int dx[4] = {0,1,0,-1};
const int dy[4] = {-1,0,1,0};
int n,m,flag;
struct node
{
int x,y;
int dir;//记录方向
int step;//记录转弯次数
};
int bfs(int x1,int y1,int x2,int y2)
{
memset(v,1,sizeof(v));
queue <node> q;
node s,temp;
s.x = x1;
s.y = y1;
s.dir = -1;//-1表示朝哪个方向都可以
s.step = 0;
q.push(s);
while(!q.empty())
{
temp = q.front();
q.pop();
if(temp.x == x2 && temp.y == y2 && temp.step <= 2)
return 1;
for(int i = 0; i < 4; i ++)
{
s = temp;
s.x += dx[i];
s.y += dy[i];
if(s.x >= 1 && s.x <= n && s.y >= 1 && s.y <= m && (map[s.x][s.y] == 0 || (s.x == x2 && s.y == y2)))
{
if(s.dir != -1)
{
if(s.dir != i)
{
s.dir = i;
s.step ++;
}
}
else s.dir = i;
if(s.step > 2) continue;
if(s.step <= v[s.x][s.y])//保证转弯次数最少,等号不能忘记
{
v[s.x][s.y] = s.step;
q.push(s);
}
}
}
}
return 0;
}
int main()
{
int i,j,t,x1,y1,x2,y2;
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",&x1,&y1,&x2,&y2);
if(!map[x1][y1] || !map[x2][y2] || map[x1][y1] != map[x2][y2] || (x1 == x2 && y1 == y2) )
flag = 0;
else flag = bfs(x1,y1,x2,y2);
if(flag) puts("YES");
else puts("NO");
}
}
return 0;
}