http://codeforces.com/contest/510/problem/B
题意: n行 每行m个颜色 问相同的颜色能否构成环
思路: 对没vis过的位置dfs 一直到满足条件为止
#include<cstdio> #include<cstring> #include<iostream> #include<algorithm> using namespace std; char mat[100][100]; int vis[100][100]; int n,m; int ok; int op[4][2]={0,1,0,-1,1,0,-1,0}; void dfs(int i,int j,int x,int y) { if(ok) return ; vis[i][j]=1; for(int z=0;z<4;z++) { int nx=i+op[z][0]; int ny=j+op[z][1]; if(nx<0||nx>=n||ny<0||ny>=m) continue; if(mat[i][j]==mat[nx][ny]) { if(vis[nx][ny]==1&&(nx!=x||ny!=y)) { ok=1; } else if(vis[nx][ny]==0&&mat[i][j]==mat[nx][ny]) dfs(nx,ny,i,j); } } } int main() { //int n,m; int i,j,k; while(scanf("%d%d",&n,&m)!=EOF) { for(i=0;i<n;i++) scanf("%s",mat[i]); memset(vis,0,sizeof(vis)); ok=0; for(i=0;i<n;i++) { if(ok) break; for(j=0;j<m;j++) { if(!vis[i][j]) dfs(i,j,-1,-1); } } if(ok) printf("Yes "); else printf("No "); } return 0; }