首页 > 代码库 > 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)
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。