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

来源:互联网 发布:在手机淘宝怎么开店 编辑:程序博客网 时间:2024/05/28 09:33

连连看

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;                        }                }                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");                }        }}
0 0
原创粉丝点击