http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1416
中文题意。
开始t了一发。后来发现了剪枝。
那就是如果再dfs的过程中发现了以前搜索的点,并且这个点不是当前搜索点的父亲节点,那么必然已经成环,并且大小至少为4
并查集没怎么看懂。补
#include <stdio.h>
#include <string.h>
#include <math.h>
#include <algorithm>
/*
*/
const int maxn=51;
int m,n;
int fx[4][2]={{1,0},{-1,0},{0,1},{0,-1}};
bool vis[maxn][maxn];
char k[maxn][maxn];
bool flag;
char col;
int unix;
int uniy;
void dfs(int i,int j,int sum,int fax,int fay){
if(flag) return ;
if(sum>=4&&i==unix&&j==uniy){
flag=true;return;
}
for(int ii=0;ii<4;ii++){
int x=i+fx[ii][0];
int y=j+fx[ii][1];
if(x<1||x>m||y<1||y>n) continue;
if(vis[x][y]&&k[x][y]==col&&sum>=4){
if(x!=fax&&y!=fay){
flag=true;break;
}
}
if(!vis[x][y]&&k[x][y]==col){
vis[x][y]=true;
dfs(x,y,sum+1,i,j);
//vis[x][y]=false;
}
}
}
int main()
{ while(~scanf("%d%d",&m,&n)){
for(int i=1;i<=m;i++){
for(int j=1;j<=n;j++){
scanf(" %c",&k[i][j]);
}
}
flag=false;
for(int i=1;i<=m&&!flag;i++){
for(int j=1;j<=n&&!flag;j++){
memset(vis,false,sizeof(vis));
col=k[i][j];
unix=i;
uniy=j;
dfs(i,j,1,-1,-1);
}
}
if(flag)
puts("YES");
else
puts("NO");
}
return 0;
}