AC代码:
#include <iostream>
#include <cstdio>
#include <cstring>
#include <queue>
using namespace std;
const int dx[] = {-1,0,1,0},dy[] = {0,1,0,-1};
//醉了,醉了,居然败给扩展顺序上了
//原来的const int dx[] = {-1,0,1,0},dy[] = {0,-1,0,1};
/*
3 4
1 1 0 5
0 0 0 0
5 0 1 0
2
3 1 1 4
1 4 3 1
*/
struct node{
int x,y;
int dir;
int cnt;
};
int n,m;
int maze[1005][1005];
int vis[1005][1005];
int bfs(int x1,int y1,int x2,int y2){
memset(vis,0,sizeof(vis));
queue<node> q;
node cur;
q.push(node{x1,y1,-1,0});
vis[x1][y1] = 1;
while(!q.empty()){
cur = q.front();
q.pop();
if(cur.cnt > 3)
continue;
for(int i = 0; i < 4; i++){
int xx = cur.x+dx[i],yy = cur.y+dy[i],flag = 0;
if(xx <= 0 || xx > n || yy <= 0 || yy > m)
continue;
if(cur.dir != i){
flag = 1;
}
if(xx == x2 && yy == y2 && cur.cnt+flag <= 3)
return 1;
if(maze[xx][yy] || vis[xx][yy])
continue;
if(cur.dir != i){
flag = 1;
}
q.push(node{xx,yy,i,cur.cnt+flag});
vis[xx][yy] = 1;
}
}
return -1;
}
int main(){
while(scanf("%d%d",&n,&m),n+m){
for(int i = 1; i <= n; i++){
for(int j = 1; j <= m; j++){
scanf("%d",&maze[i][j]);
}
}
int q;
scanf("%d",&q);
while(q--){
int x1,y1,x2,y2;
scanf("%d%d%d%d",&x1,&y1,&x2,&y2);
if(maze[x1][y1] != maze[x2][y2] || !(maze[x1][y1]+maze[x2][y2])){
printf("NO\n");
continue;
}
int ans = bfs(x1,y1,x2,y2);
if(ans < 0)
printf("NO\n");
else
printf("YES\n");
}
}
return 0;
}
基于BFS解决迷宫问题
1965

被折叠的 条评论
为什么被折叠?



