题目链接地址:http://acm.hdu.edu.cn/showproblem.php?pid=1175
/*BFS
Date: 2012/10/11
题目链接地址:http://acm.hdu.edu.cn/showproblem.php?pid=1175
思路:和逃离迷宫思路差不多,一个方向找到底
哎,因为printf("N0\n"),错了n次,改了n久
O写成了0
*/
#include<iostream> #include<queue> using namespace std; #define maxn 1001 int dir[][2] = {{0,-1},{1,0},{0,1},{-1,0}}; int matrix[maxn][maxn]; int n,m,t,si,sj,ei,ej; bool visited[maxn][maxn]; struct node { int x,y,dir,t; //dir为方向,t为转弯的次数 }; bool ok(int i,int j) { return i >= 1 && i <= n && j >= 1 && j <= m && matrix[i][j] == 0; } void bfs() { queue<node> que; node p,q; memset(visited,false,sizeof(visited)); p.x = si,p.y = sj,p.t = -1,p.dir = -1; que.push(p); visited[si][sj] = true; while(!que.empty()) { p = que.front(); que.pop(); for(int i = 0; i < 4; i++) { q.x = p.x + dir[i][0], q.y = p.y + dir[i][1], q.t = p.t + 1; if(i%2) q.dir = 1; else q.dir = 0; if(q.x == ei && q.y == ej && q.t <= 2) { printf("YES\n"); return; } while(ok(q.x,q.y) && q.t <= 2 && q.dir != p.dir) { if(!visited[q.x][q.y] && q.t <= 1) que.push(q),visited[q.x][q.y] = true; q.x += dir[i][0],q.y += dir[i][1]; if(q.x == ei && q.y == ej && q.t <= 2) { printf("YES\n"); return; } } } } printf("NO\n"); } int main() { //freopen("1004.txt","r",stdin); while(scanf("%d%d",&n,&m) && (n||m)) { int i,j; for(i = 1; i <= n; i++) for(j = 1; j <= m; j++) scanf("%d",&matrix[i][j]); scanf("%d",&t); while(t--) { scanf("%d%d%d%d",&si,&sj,&ei,&ej); if(matrix[si][sj] != matrix[ei][ej] || matrix[si][sj] == 0 || (si == ei && sj == ej)) printf("NO\n"); else bfs(); } } return 0; }