连连看
Time Limit: 20000/10000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 26235 Accepted Submission(s): 6501
Problem Description
“连连看”相信很多人都玩过。没玩过也没关系,下面我给大家介绍一下游戏规则:在一个棋盘中,放了很多的棋子。如果某两个相同的棋子,可以通过一条线连起来(这条线不能经过其它棋子),而且线的转折次数不超过两次,那么这两个棋子就可以在棋盘上消去。不好意思,由于我以前没有玩过连连看,咨询了同学的意见,连线不能从外面绕过去的,但事实上这是错的。现在已经酿成大祸,就只能将错就错了,连线不能从外围绕过。
玩家鼠标先后点击两块棋子,试图将他们消去,然后游戏的后台判断这两个方格能不能消去。现在你的任务就是写这个后台程序。
玩家鼠标先后点击两块棋子,试图将他们消去,然后游戏的后台判断这两个方格能不能消去。现在你的任务就是写这个后台程序。
Input
输入数据有多组。每组数据的第一行有两个正整数n,m(0<n<=1000,0<m<1000),分别表示棋盘的行数与列数。在接下来的n行中,每行有m个非负整数描述棋盘的方格分布。0表示这个位置没有棋子,正整数表示棋子的类型。接下来的一行是一个正整数q(0<q<50),表示下面有q次询问。在接下来的q行里,每行有四个正整数x1,y1,x2,y2,表示询问第x1行y1列的棋子与第x2行y2列的棋子能不能消去。n=0,m=0时,输入结束。
注意:询问之间无先后关系,都是针对当前状态的!
注意:询问之间无先后关系,都是针对当前状态的!
Output
每一组输入数据对应一行输出。如果能消去则输出"YES",不能则输出"NO"。
Sample Input
3 4 1 2 3 4 0 0 0 0 4 3 2 1 4 1 1 3 4 1 1 2 4 1 1 3 3 2 1 2 4 3 4 0 1 4 3 0 2 4 1 0 0 0 0 2 1 1 2 4 1 3 2 3 0 0
解析:一道DFS题目,我们曾拿这个题作为DFS入门题目,今天又拿出来做了下。思路不难,相当于迷宫,将各个方向走一遍,中间用到一个一个剪枝是,当拐弯达到两次的时候,判断下终点是否和现在位置在一条直线上,不在一条直线上的话就结束掉。
递归的操作需要多注意一些细节。
代码如下:
#include <stdio.h>
int star_x,star_y,finish_x,finish_y;
int map[1005][1005];
int dir1[4]={-1,0,1,0};
int dir2[4]={0,1,0,-1};
int peace;
int n,m;
void dfs(int i,int j,int index,int z)
{
if(peace)
return ;
if(i==finish_x && j==finish_y)
{
peace=1;
return ;
}
if(i<1 || j<1 || i>n || j>m) //越界剪枝
return ;
if(index>2)
return ;
if(index==2)
{
if(!((z==1 && i>finish_x && j==finish_y) ||
(z==2 && i==finish_x && j<finish_y) ||
(z==3 && i<finish_x && j==finish_y) ||
(z==4 && i==finish_x && j>finish_y)))
return ;
}
if(map[i][j]!=0)
return ;
map[i][j]=-1;
for(int k=0;k<4;k++)
{
if(k+1==z)
dfs(i+dir1[k],j+dir2[k],index,z);
else
dfs(i+dir1[k],j+dir2[k],index+1,k+1);
}
map[i][j]=0;
}
int main()
{
int i,j,p;
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",&p);
while(p--)
{
scanf("%d %d %d %d",&star_x,&star_y,&finish_x,&finish_y);
if(map[star_x][star_y]!=map[finish_x][finish_y] || map[star_x][star_y]==0)
{
printf("NO\n");
continue;
}
else
{
peace=0;
for(i=1;i<=4;i++)
dfs(star_x+dir1[i-1],star_y+dir2[i-1],0,i);
if(peace)
printf("YES\n");
else
printf("NO\n");
}
}
}
return 0;
}