hdu 1175 连连看 (深搜)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1175

题目大意:如果某两个相同的棋子,可以通过一条线连起来(这条线不能经过其它棋子)这样的两个棋子可以消掉。还有一个要注意的地方的就是转弯。转弯的次数不超过两次,这两个棋子才可以在棋盘上消去~

 1 #include <iostream>
 2 #include <cstdio>
 3 #include <cstring>
 4 using namespace std;
 5 int sx,sy,bx,by,wan,dir[4][2]= {0,1,0,-1,1,0,-1,0},n,m;
 6 int vis[1110][1110],a[1110][1110],flag;
 7
 8 void dfs(int x,int y,int wan,int fang)
 9 {
10     if (flag==1)
11     return ;
12     if (wan==2&&x!=bx&&y!=by)
13         return ;
14     if (wan>2)
15         return ;
16     for (int i=0; i<4; i++)
17     {
18         int X=x+dir[i][0];
19         int Y=y+dir[i][1];
20         if (X==bx&&Y==by)
21             //printf ("Yes\n");
22         {
23             flag=1;
24             return ;
25         }
26         if (X>0&&X<=n&&Y>0&&Y<=m&&!vis[X][Y]&&a[X][Y]==0)
27         {
28             vis[X][Y]=1;
29             if (fang!=i)
30                 dfs(X,Y,wan+1,i);
31             else
32                 dfs(X,Y,wan,i);
33             vis[X][Y]=0;
34         }
35
36     }
37 }
38
39 int main ()
40 {
41     while (~scanf("%d%d",&n,&m))
42     {
43         if (n==0&&m==0)
44             break;
45         for (int i=1; i<=n; i++)
46             for (int j=1; j<=m; j++)
47                 cin>>a[i][j];
48         int k;
49         cin>>k;
50         while (k--)
51         {
52             flag=0;
53             memset(vis,0,sizeof(vis));
54             cin>>sx>>sy>>bx>>by;
55             if (a[sx][sy]!=a[bx][by]||(a[sx][sy]==0||a[bx][by]==0))
56                 printf ("NO\n");
57             else
58             {
59                 dfs(sx,sy,-1,-1);
60                 if (flag==1)
61                     printf ("YES\n");
62                 else
63                     printf ("NO\n");
64             }
65         }
66     }
67     return 0;
68 }

hdu 1175 连连看 (深搜),布布扣,bubuko.com

时间: 2024-09-29 14:27:48

hdu 1175 连连看 (深搜)的相关文章

hdu 1175 连连看(模拟循环队列)

连连看 Time Limit: 20000/10000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 18149    Accepted Submission(s): 4741 Problem Description "连连看"相信很多人都玩过.没玩过也没关系,下面我给大家介绍一下游戏规则:在一个棋盘中,放了很多的棋子.如果某两个相同的棋子,可以通过一条线连起来(这条

HDU - 1175 连连看 DFS (记录方向)

连连看HDU - 1175 "连连看"相信很多人都玩过.没玩过也没关系,下面我给大家介绍一下游戏规则:在一个棋盘中,放了很多的棋子.如果某两个相同的棋子,可以通过一条线连起来(这条线不能经过其它棋子),而且线的转折次数不超过两次,那么这两个棋子就可以在棋盘上消去.不好意思,由于我以前没有玩过连连看,咨询了同学的意见,连线不能从外面绕过去的,但事实上这是错的.现在已经酿成大祸,就只能将错就错了,连线不能从外围绕过. 玩家鼠标先后点击两块棋子,试图将他们消去,然后游戏的后台判断这两个方格能

【dfs】hdu 1175 连连看

[dfs]hdu 1175 连连看 题目链接:hdu 1175 连连看 题目大意 连连看,问能否成功? 题意很简单,就是我们平时玩的连连看的游戏规则,貌似dfs和bfs都能做,笔者就做了个dfs(好想),超时了好几次,原因是dfs(int d)与终点的d重载矛盾了,所以还是要小心. 说一下思路 神器的剪枝:if(t==2&&x!=c&&y!=d) return;这一部剪枝妙笔回春,9000+MS优化到100+MS啊:如果转了2次,但是目标与当前位置不在同一行或同一列就不满足

hdu 1518 Square 深搜,,,,花样剪枝啊!!!

Square Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 9588    Accepted Submission(s): 3127 Problem Description Given a set of sticks of various lengths, is it possible to join them end-to-end

HDU 5305 Friends(深搜)

题意:t组数据,每组一个n和m表示点数和边数,接下来m条边,每条边两种状态,求每个点邻接边的两种状态数目相同的排列方式有几种 分析:从第一个顶点开始往下深搜每条边,每条边两种状态,注意回朔. 代码: #include<cstdio> #include<cstring> #include<algorithm> #include<cmath> using namespace std; const int maxn = 10; int n,m,ans; int e

HDU 1175 连连看(DFS)

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

Hdu 1175 连连看(DFS)

Problem地址:http://acm.hdu.edu.cn/showproblem.php?pid=1175 因为题目只问能不能搜到,没问最少要几个弯才能搜到,所以我采取了DFS. 因为与Hdu 1728相比,都要考虑转弯次数,所以在判断转弯的次数上,两者可以相互借鉴. 这一点应该不难想到,在搜索前就应判断两点的值是否相等,以及两点的值中是否有0.如果不相等或其中一值为0,则可以判断是"NO". 时间虽是10000ms,但只是这样,还是超时. 后来又加了一个数组walk[][],用

HDU - 1175 连连看(带转弯的dfs)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1175 题意:代码模拟连连看(转弯数不能超过两次)并且不能绕外圈. 和前面几题大同小异,只不过要标记一下,因为连在一起的相当于这两个点没有了. 1 #include <iostream> 2 #include <cstring> 3 using namespace std; 4 5 int dx[4]={0,1,0,-1}; 6 int dy[4]={1,0,-1,0}; 7 int m

hdu - 1728逃离迷宫 &amp;&amp; hdu - 1175 连连看 (普通bfs)

http://acm.hdu.edu.cn/showproblem.php?pid=1728 这两道题花了一下午的时候调试,因为以前做过类似的题,但是判断方向的方法是错的,一直没发现啊,真无语. 每个状态除了坐标外还需要记录步数,和方向.还要注意输入格式. 并且每一个点并不是走过了就不能在走,只要到达这个点的时候转向次数少的就可以更新这个点,可以等于.千万注意这个坑. 1 #include <cstdio> 2 #include <cstring> 3 #include <q