連連看
Time Limit: 20000/10000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 32137 Accepted Submission(s): 7921
玩家鼠標先後點擊兩塊棋子,試圖將他們消去,然後遊戲的後臺判斷這兩個方格能不能消去。現在你的任務就是寫這個後臺程序。
注意:詢問之間無先後關係,都是針對當前狀態的!
#include<stdio.h>
#include<iostream>
#include<algorithm>
#include<string.h>
#include<queue>
using namespace std;
int map[1010][1010],vis[1010][1010];
int n,m;
int x1,x2,y1,y2;
int dir[4][2]={0,1,0,-1,1,0,-1,0};
struct node
{
int a,b;
int k,l;
};
int bfs(int x,int y)
{
queue<node>q;
memset(vis,0,sizeof(vis));
node now,end;
now.a=x;
now.b=y;
now.k=0;//轉彎次數
now.l=-1;//當前方向
q.push(now);
vis[x][y]=1;
while(!q.empty())
{
now=q.front();
q.pop();
if(now.a==x2&&now.b==y2)
return 1;
for(int i=0;i<4;i++)
{
end.a=now.a+dir[i][0];
end.b=now.b+dir[i][1];
end.l=i;
if(end.l!=now.l&&now.l!=-1)
end.k=now.k+1;
else
end.k=now.k;
if(end.k>2)
continue;
if(end.a>=1&&end.b<=m&&vis[end.a][end.b]==0&&(map[end.a][end.b]==0||(end.a==x2&&end.b==y2)))
{
q.push(end);
vis[end.a][end.b]=1;
}
}
}
return 0;
}
int main()
{
while(scanf("%d%d",&n,&m)&&n||m)
{
int p;
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
scanf("%d",&map[i][j]);
scanf("%d",&p);
while(--p>=0)
{
scanf("%d%d%d%d",&x1,&y1,&x2,&y2);
if(map[x1][y1]!=map[x2][y2]||map[x1][y1]==0||map[x2][y2]==0)
{
printf("NO\n");
continue;
}
if(bfs(x1,y1))
printf("YES\n");
else
printf("NO\n");
}
}
}