图2(矩环问题)
问题描述
小鑫的女朋友被魔王抢走了!魔王留给小鑫一张n*m大的表,上面有各种各样的颜色,用A-Z这26个字母来表示。魔王留给他一个任务,如果小鑫可以在这张表中找出任意一个长度大于1的环,并且这个环的颜色是相同的,魔王就把小鑫的女朋友还给他。为了从魔王手中夺回他的女朋友,小鑫请你帮忙,你能帮帮他吗?
输入
多组输入。每组的第一行有两个整数n,m。代表表的大小。接下来是由A-Z的一些字母所构成的n行m列的表。1<=n,m<=200
输出
如果可以救回他的女朋友,输出Yes,否则输出No
样例输入
4 7
ABCBBAA
BCBCBCB
AABBCCA
ACCCBBB
10 3
AAC
ABB
BBA
AAC
CBC
CCA
CBB
CCA
CCB
BAA
样例输出
No
Yes
#include"iostream" using namespace std; char map[201][201]; //图 bool v[201][201]; //记录是否遍历过 int w,h; //图的宽高 int pos[4][2] = {{1,0},{-1,0},{0,-1},{0,1}}; //四个方向 int dir1[4] = {1,0,3,2}; //相反方向 bool flag; //标记 void create(){ for(int i = 0;i < h;i++){ for(int j = 0;j < w;j++){ cin>>map[i][j]; } } } void dfs(int y,int x,char c,int dir){ //上下左右:0,1,2,3 if(v[y][x]){ flag = true; } if(map[y][x] == c){ map[y][x] = '0'; v[y][x] = 1; for(int i = 0;i < 4;i++){ if(pos[i][0] + y >= 0 && pos[i][0] + y < h && pos[i][1] + x >= 0 && pos[i][1] + x < w && dir1[i] != dir) //没越界且没反向 dfs(pos[i][0] + y,pos[i][1] + x,c,i); } } v[y][x] = false; } int main(){ memset(v,0,sizeof(v)); while(cin>>h>>w && h && w){ flag = false; create(); for(int i = 0;i < h;i++){ for(int j = 0;j < w;j++){ if(map[i][j] != '0'){ dfs(i,j,map[i][j],3); } if(flag) break; } if(flag) break; } if(flag) cout<<"YES"<<endl; else cout<<"NO"<<endl; } return 0; }
BY oleolema