51 nod 1416 两点
并查集做法
#include <bits/stdc++.h>
using namespace std;
#define mac 100005
char a[100][100];
int par[3600];
int m,n;
void init(){
for(int i=0;i<=n*m;i++)
par[i]=i;
}
int find(int x){
if(par[x]==x)
return x;
else
return par[x]=find(par[x]);
}
bool unionn(int x,int y){
x=find(x);
y=find(y);
if(x==y)
return true;
par[x]=y;
return false;
}
int main(){
while(cin>>n>>m){
int flag=0;
init();
for(int i=0;i<n;i++)
scanf("%s",a[i]);
for(int i=0;i<n;i++){
for(int j=0;j<m;j++){
if(i!=n-1&&a[i][j]==a[i+1][j]&&unionn(i*m+j,(i+1)*m+j))
flag=!flag;
if(j!=m-1&&a[i][j]==a[i][j+1]&&unionn(i*m+j,i*m+j+1))
flag=!flag;
if(flag)
break;
}
if(flag)
break;
}
if(flag)
cout<<"Yes"<<endl;
else
cout<<"No"<<endl;
}
return 0;
}
DFS做法
#include <bits/stdc++.h>
using namespace std;
#define mac 100005
char a[100][100],visit[100][100];
int xy[4][2]={0,1,0,-1,-1,0,1,0};
int m,n,flag;
void dfs(int x, int y, int pre, char c){
if(x<0||x>n||y<0||y>m||a[x][y]!=c)
return ;
if(visit[x][y]){
flag=1;
return;
}
visit[x][y]=1;
for(int i=0;i<4;i++){
if(pre==0&&i==1) continue;
if(pre==1&&i==0) continue;
if(pre==2&&i==3) continue;
if(pre==3&&i==2) continue;
int xx=x+xy[i][0];
int yy=y+xy[i][1];
dfs(xx,yy,i,c);
}
}
int main(){
while(cin>>n>>m){
flag=0;
memset(visit,0,sizeof(visit));
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
cin>>a[i][j];
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++){
if(!visit[i][j])
dfs(i,j,-1,a[i][j]);
}
if(flag)
cout<<"Yes"<<endl;
else
cout<<"No"<<endl;
}
return 0;
}