题意:n*m个字母,判断能否成环。
分析:成环至少需要四个相同字母,dfs一直往下搜索,每遇到相同字母将其标记,若遇到相同字母且被标记可判断已成环(此字母不能是上一个字母,因此要记录下此时的字母)。
代码如下:
#include<cstdio> #include<algorithm> #include<cstring> using namespace std; const int maxn=60; int n,m; bool vis[maxn][maxn]; char str[maxn][maxn]; bool flag=0; int dis[4][2]={0,1,0,-1,1,0,-1,0}; void dfs(int x,int y,int lx,int ly,char s) { vis[x][y]=1; for(int i=0;i<4;i++) { int nx=x+dis[i][0]; int ny=y+dis[i][1]; if(nx>=0&&nx<n&&ny>=0&&ny<m&&str[nx][ny]==s) { if(vis[nx][ny]&&(nx!=lx||ny!=ly)) flag=1; if(!vis[nx][ny]) { vis[nx][ny]=1; dfs(nx,ny,x,y,s); } } } } int main() { scanf("%d%d",&n,&m); for(int i=0;i<n;i++) { scanf("%s",str[i]); getchar(); } for(int i=0;i<n;i++) { for(int j=0;j<m;j++) { if(!vis[i][j]) dfs(i,j,-1,-1,str[i][j]); if(flag) break; } if(flag) break; } if(flag) printf("Yes\n"); else printf("No\n"); return 0; }