您的位置:首页 > 编程语言 > C语言/C++

【hdu 1175】 连连看 题解 (c++)

2016-04-14 21:49 281 查看

连连看

Time Limit: 20000/10000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)

Total Submission(s): 27957 Accepted Submission(s): 6945

Problem Description

“连连看”相信很多人都玩过。没玩过也没关系,下面我给大家介绍一下游戏规则:在一个棋盘中,放了很多的棋子。如果某两个相同的棋子,可以通过一条线连起来(这条线不能经过其它棋子),而且线的转折次数不超过两次,那么这两个棋子就可以在棋盘上消去。不好意思,由于我以前没有玩过连连看,咨询了同学的意见,连线不能从外面绕过去的,但事实上这是错的。现在已经酿成大祸,就只能将错就错了,连线不能从外围绕过。

玩家鼠标先后点击两块棋子,试图将他们消去,然后游戏的后台判断这两个方格能不能消去。现在你的任务就是写这个后台程序。

Input

输入数据有多组。每组数据的第一行有两个正整数n,m(0

#include<iostream>
#include<stdio.h>
#include<string.h>
using namespace std;
int arr[1100][1100];//记录原数组
int vis[1100][1100];//记录dfs中有没有搜到过
int n,m;
int f;
int dfs(int x1,int y1,int x2,int y2,int num,int dd)
{
// cout<<x1<<"   "<<y1<<"   "<<num<<endl;
if (f==1)       return 0;
if (num>2)      return 0;
if (x1==x2 && y1==y2)   {f=1;return 0;}
int a,b,c,d;
a=x1+1;
if (a<=n && vis[a][y1]==0)
{
vis[a][y1]=1;
//  cout<<"asdfasd"<<endl;
if (a==x2 && y1==y2)   //find the tar //注意这个过程,就是要找到答案之后更改vis再return 来避免初始化vis的超时
{
// cout<<"   sss    "<<a<<"  "<<y1<<"  "<<dd<<endl;
//cout<<" num is "<<num<<endl;
if (dd==3)
{
f=1;
vis[a][y1]=0;
//cout<<"================="<<endl;
return 0;
}
else if (dd!=3 && num<=1)
{
f=1;
vis[a][y1]=0;
//cout<<"================="<<endl;
return 0;
}
}
if (arr[a][y1]==0)
if (dd==3)//方向的变换
dfs(a,y1,x2,y2,num,dd);
else
dfs(a,y1,x2,y2,num+1,3);
vis[a][y1]=0;
}
b=y1+1;
if (b<=m && vis[x1][b]==0)
{
vis[x1][b]=1;
if (x1==x2 && b==y2)
{
if (dd==2 || (dd!=2 && num<=1))
{
f=1;
vis[x1][b]=0;
return 0;
}
}

a6f9
if (arr[x1][b]==0)
if (dd==2)
dfs(x1,b,x2,y2,num,dd);
else dfs(x1,b,x2,y2,num+1,2);
vis[x1][b]=0;
}
a=x1-1;
if (a>=0 && vis[a][y1]==0)
{
vis[a][y1]=1;
if (a==x2 && y1==y2)
{
if (dd==1 || (dd!=1 && num<=1))
{
f=1;
vis[a][y1]=1;
return 0;
}

}

if (arr[a][y1]==0)

if (dd==1)
dfs(a,y1,x2,y2,num,dd);
else
dfs(a,y1,x2,y2,num+1,1);
vis[a][y1]=0;
}
b=y1-1;
if (b>0 && vis[x1][b]==0)
{
vis[x1][b]=1;
if (x1==x2 && b==y2)
{
if (dd==4 || (dd!=4 &&num<=1))
{
f=1;
vis[x1][b]=0;
return 0;
}
}
if (arr[x1][b]==0)
if (dd==4)
dfs(x1,b,x2,y2,num,dd);
else dfs(x1,b,x2,y2,num+1,4);
vis[x1][b]=0;
}
}

int main()
{
int a,b,c,d,k;
while(cin>>n>>m)
{
if (n==0)       return 0;
for (int i=1;i<=n;i++)
for (int j=1;j<=m;j++)
scanf("%d",&arr[i][j]);
scanf("%d",&k);
for (int i=1;i<=k;i++)
{
scanf("%d%d%d%d",&a,&b,&c,&d);
f=0;
if (arr[a][b]!=arr[c][d] || (arr[a][b]==0 && arr[c][d]==0))//先判断两个点是否相同,相同再搜,或者两个都是0,直接NO
{printf("NO\n");continue;}
dfs(a,b,c,d,-1,-1);
if (f==0)       printf("NO\n");
else if (f==1) printf("YES\n");
}
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: