Problem Description
小鑫的女朋友被魔王抢走了!
魔王留给小鑫一张n*m大的表,上面有各种各样的颜色,用A-Z这26个字母来表示。魔王留给他一个任务,如果小鑫可以在这张表中找出任意一个长度大于1的环,并且这个环的颜色是相同的,魔王就把小鑫的女朋友还给他。为了从魔王手中夺回他的女朋友,小鑫请你帮忙,你能帮帮他吗?Input
多组输入。
每组的第一行有两个整数n,m。代表表的大小。
接下来是由A-Z的一些字母所构成的n行m列的表。
1<=n,m<=200Output
如果可以救回他的女朋友,输出Yes,否则输出No
Sample Input
4 7 ABCBBAA BCBCBCB AABBCCA ACCCBBB 10 3 AAC ABB BBA AAC CBC CCA CBB CCA CCB BAASample Output
No Yes
#include<bits/stdc++.h> using namespace std; char mp[210][210]; int vis[210][210]; int n, m, flag; void dfs(int x, int y, int xx, int yy) //x,y为当前节点,xx,yy为父节点 { int next[5][4] = {{0,1},{0,-1},{1,0},{-1,0}}; vis[x][y] = 1; for(int t = 0; t < 4; t++) { int i = x + next[t][0]; int j = y + next[t][1]; if(i>=0 && i<n && j>=0 && j<m && mp[i][j]==mp[x][y]) { if(!vis[i][j]) dfs(i, j, x, y); else if(i != xx && j != yy) //当前节点的下一节点不是父节点,且被访问过,是环; { flag = 1; return ; } } } } int main() { while(cin>>n>>m) { flag = 0; memset(vis, 0, sizeof(vis)); for(int i = 0; i < n; i++) cin>>mp[i]; for(int i = 0; i < n; i++) { for(int j = 0; j < m; j++) { if(!vis[i][j]) { dfs(i, j, i, j); if(flag) break; } } if(flag) break; } if(flag) cout<<"Yes"<<endl; else cout<<"No"<<endl; } }