Time Limit: 20000/10000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 14418 Accepted Submission(s): 3778
spa
#include <stdio.h> typedef struct { int aim; int x; int y; }Qu; Qu Queue[1000005];//隊列 int Map[1005][1005];//數字矩陣 int Time[1005][1005];//到達某個位置的次數 int move[4][2]={0,1,-1,0,0,-1,1,0}; int x1,y1,x2,y2; int m,n,t; int BFS() { int i; int I,J; int time; int rear,front; rear=front=-1; rear++; Time[x1][y1]=0; Queue[rear].aim=0; Queue[rear].x=x1; Queue[rear].y=y1; while(rear>front) { front++; //找到返回1 if(Queue[front].x==x2 && Queue[front].y==y2) { return 1; } //四個方向搜索 for(i=0;i<4;i++) { I=Queue[front].x+move[i][0]; J=Queue[front].y+move[i][1]; if((!Map[I][J] || I==x2 && J==y2) && I>0 && J>0 && I<=m && J<=n) { //開始的方向和如今的方向不一樣則次數加一 if(Queue[front].aim && Queue[front].aim!=i+1) { time=Time[Queue[front].x][Queue[front].y]+1; } else { //!Queue[front].aim表明沒有轉彎 if(!Queue[front].aim || Queue[front].aim==i+1) { time=Time[Queue[front].x][Queue[front].y]; } } //若是當前到達某個數字的轉彎次數少於之前的次數,則將該數字的位置如隊列,並更新次數 if(Time[I][J]>=time && time<3) { rear++; Queue[rear].aim=i+1;//方向爲當前的方向 Queue[rear].x=I; Queue[rear].y=J; Time[I][J]=time;//更新次數 } } } } return 0; } int main() { int i,j,k; while(1) { scanf("%d %d",&m,&n); if(!m && !n) { break; } for(i=1;i<=m;i++) { for(j=1;j<=n;j++) { scanf("%d",&Map[i][j]); } } scanf("%d",&t); for(i=0;i<t;i++) { for(j=1;j<=m;j++) { for(k=1;k<=n;k++) { Time[j][k]=100000000;//次數初始化爲無窮大 } } scanf("%d %d %d %d",&x1,&y1,&x2,&y2); if(!Map[x1][y1] || !Map[x2][y2] || (Map[x1][y1]!=Map[x2][y2])) { printf("NO\n"); continue; } if(BFS() || (x1==x2 && y1==y2)) { printf("YES\n"); } else { printf("NO\n"); } } } return 0; }