51Nod - 1416 两点(搜索)
2017-05-11 01:19
459 查看
上题:福克斯在玩一款手机解迷游戏,这个游戏叫做”两点”。基础级别的时候是在一个n×m单元上玩的。像这样: 每一个单元有包含一个有色点。我们将用不同的大写字母来表示不同的颜色。这个游戏的关键是要找出一个包含同一颜色的环。看上图中4个蓝点,形成了一个环。一般的,我们将一个序列 d1,d2,...,dk 看成一个环,当且仅当它符合下列条件时:1. 这k个点不一样,即当 i≠j时, di 和 dj不同。2. k至少是4。3. 所有的点是同一种颜色。4. 对于所有的 1≤i≤k-1: di 和 di+1 是相邻的。还有 dk 和 d1 也应该相邻。单元 x 和单元 y 是相邻的当且仅当他们有公共边。当给出一幅格点时,请确定里面是否有环。Input单组测试数据。 第一行包含两个整数n和m (2≤n,m≤50):板子的行和列。 接下来n行,每行包含一个有m个字母的串,表示当前行每一个点的颜色。每一个字母都是大写字母。Output如果有环输出Yes,否则输出No。Sample Input
3 4 AAAA ABCA AAAA 3 4 AAAA ABCA AADASample Output
Yes No
思路就是 你从一个点出发,遇到相同的就接着往下搜索,如果你搜了一圈又回到了你出发的点的话,那就是符合要求的,就是这样。当时写的很急,所以代码写的巨丑,回来可以改一下(感觉自己并不会改。。。
#include<stdio.h> #include<string.h> #include<iostream> using namespace std; int n,m; int flag=0,vis[50][50]; char map[55][55]; int s,e; //1 shang 2 xia 3you 4 zuo void dfs(int i,int j,char ch,int dir) { // printf("s==%d e==%d i===%d j=%d \n",s,e,i,j); if(s==i&&e==j&&vis[i][j])//从起点回到起点并且走过了 { flag=1; return ; } if(flag) { return ; } if(i<0||j<0||i>=n||j>=m) { return ; } if(dir==2) { if(!vis[i+1][j]&&ch==map[i+1][j])//xia { vis[i+1][j]=1; dfs(i+1,j,ch,2); } if(!vis[i][j+1]&&ch==map[i][j+1])//you { vis[i][j+1]=1; dfs(i,j+1,ch,3); } if(!vis[i][j-1]&&ch==map[i][j-1])//zuo { // printf("@@@@2222\n"); vis[i][j-1]=1; dfs(i,j-1,ch,4); } } else if(dir==1)//1 shang 2 xia 3you 4 zuo { if(!vis[i-1][j]&&ch==map[i-1][j])//shang { vis[i-1][j]=1; dfs(i-1,j,ch,1); } if(!vis[i][j+1]&&ch==map[i][j+1])//you { vis[i][j+1]=1; dfs(i,j+1,ch,3); } if(!vis[i][j-1]&&ch==map[i][j-1])//zuo { // printf("111\n"); vis[i][j-1]=1; dfs(i,j-1,ch,4); } } else if(dir==3)//you { if(!vis[i-1][j]&&ch==map[i-1][j])//shang { vis[i-1][j]=1; dfs(i-1,j,ch,1); } if(!vis[i+1][j]&&ch==map[i+1][j])//xia { vis[i+1][j]=1; dfs(i+1,j,ch,2); } if(!vis[i][j+1]&&ch==map[i][j+1])//you { // printf("@i==%d @j=%d\n",i,j); // printf("---\n"); vis[i][j+1]=1; dfs(i,j+1,ch,3); } } else if(dir==4) { if(!vis[i-1][j]&&ch==map[i-1][j])//shang { vis[i-1][j]=1; dfs(i-1,j,ch,1); } if(!vis[i-1][j]&&ch==map[i-1][j])//xia { vis[i-1][j]=1; dfs(i-1,j,ch,2); } if(!vis[i][j-1]&&ch==map[i][j-1])//zuo { vis[i][j-1]=1; dfs(i,j-1,ch,4); } } } int main() { while(scanf("%d%d",&n,&m)!=EOF) { flag=0; memset(vis,0,sizeof(vis)); for(int i=0;i<n;i++) { scanf("%s",map[i]); } for(int i=0;i<n;i++) { if(flag) { break; } for(int j=0;j<m;j++) { s=i; e=j; flag=0; memset(vis,0,sizeof(vis)); dfs(i,j,map[i][j],2); // printf("%d\n",flag); // system("PAUSE"); if(flag) { break; } } } if(flag) { printf("Yes\n"); } else { printf("No\n"); } } })
上代码吧:
相关文章推荐
- 51NOD 1416 两点 【水】DFS
- 51nod 1416两点DFS
- 51nod 1416 两点【并查集】
- 51nod 1416 两点
- 51Nod 1416 两点
- 51Nod - 1416 深度优先搜索
- 51Nod -1416 两点(dfs)
- 51Nod - 1416 两点
- 51nod 1416:两点 深搜
- 51NOD 1416 两点
- 51Nod - 1416 搜索环
- 51nod 1416:两点 深搜
- 51nod 1416 两点
- 1416 两点 51NOD
- 51nod 1416 两点 【dfs+特殊判断】
- 51nod 1416 两点 (dfs)
- 51nod 1416 两点(DFS)
- POJ 1416 Shredding Company 回溯搜索 DFS
- 两点(51nod 1416)
- 51nod 1421 最大mod值 (排序+二分搜索)