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)的主要内容,如果未能解决你的问题,请参考以下文章