传送门

题意: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;
 }