首页 > 代码库 > HDU - 1175 连连看(带转弯的dfs)

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)