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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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 map[1111][1111];
 8 bool vis[1111][1111];
 9 bool flag;
10 int n,m,q,x1,x2,y1,y2;
11 
12 void dfs(int x,int y,int turn,int dir){
13     int xx,yy;
14     if(flag) return; 
15     if(x>n||x<1||y<1||y>m||vis[x][y]) return;//越界,返回 
16     if(turn>2) return;//转弯数超过限定的,返回 
17     if(turn==2&&x!=x2&&y!=y2) return; //转弯数到达,但是没到点,返回 
18     if(x==x2&&y==y2&&turn<=2){
19         cout<<"YES"<<endl;
20         flag=1;
21         return;
22     }//成功,返回 
23     if(map[x][y]!=0){
24         if(x==x1&&y==y1);
25         else return;
26     }//当目前位置不为0,并且不为起点的时候要返回 
27     vis[x][y]=1;
28     for(int i=0;i<4;i++){
29         xx=x+dx[i];
30         yy=y+dy[i];
31         if(i==dir) dfs(xx,yy,turn,dir);
32         else dfs(xx,yy,turn+1,i);
33     }
34     vis[x][y]=0;
35     return;
36 }
37 
38 int main(){
39     while(cin>>n>>m,n||m){
40         memset(vis,0,sizeof(vis));
41         
42         for(int i=1;i<=n;i++)
43         for(int j=1;j<=m;j++)
44         cin>>map[i][j];
45         
46         cin>>q;
47         while(q--){
48             cin>>x1>>y1>>x2>>y2;
49             if(x1==x2&&y1==y2){
50                 cout<<"NO"<<endl;
51                 continue;
52             }//当起点终点相同的时候是不能消除
53             if(x1<1||x1>n||y1<1||y1>m||x2<1||x2>n||y2<1||y2>m){
54                 cout<<"NO"<<endl;
55                 continue;
56             }//越界 
57             if(map[x1][y1]==map[x2][y2]&&map[x1][y1]){
58                 flag=0;
59                 for(int i=0;i<4;i++) dfs(x1,y1,0,i);//4个方向处理 
60                 if(!flag) cout<<"NO"<<endl;
61             }
62             else cout<<"NO"<<endl;
63         }
64     }
65     return 0;
66 }

 

以上是关于HDU - 1175 连连看(带转弯的dfs)的主要内容,如果未能解决你的问题,请参考以下文章

HDU1175:连连看 [DFS]

HDU 1175 连连看(DFS)

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

HDU1175 连连看(DFS)

hdu1175 连连看 dfs+剪枝

hdu 1175 连连看bfs