题目连接:
https://www.luogu.com.cn/problem/AT319
code:
#include<bits/stdc++.h>
using namespace std;
int n,m;
int k;
char a[1000][1000];
int ans=0;
int flag;
void dfs(int x,int y,char ss,int fangxiang) {
//fangxiang:记录是从什么方向爬到当前位置的,fangxiang=1,由上方或下方爬来的;fangxiang=2,由左方或右方爬来的;
a[x][y]='t';
k++;
if(a[x+1][y]==ss&&x+1<=n) {//如果方向不同则 flag++
if(fangxiang==1)
flag++;
dfs(x+1,y,ss,2);
}
if(a[x-1][y]==ss&&x+1>=1) {
if(fangxiang==1)
flag++;
dfs(x-1,y,ss,2);
}
if(a[x][y+1]==ss&&y+1<=m) {
if(fangxiang==2)
flag++;
dfs(x,y+1,ss,1);
}
if(a[x][y-1]==ss&&y-1>=1) {
if(fangxiang==2)
flag++;
dfs(x,y-1,ss,1);
}
}
int main() {
scanf("%d%d",&n,&m);
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++) {
k=0;
flag=0;
if(a[i][j]!='t')
dfs(i,j,a[i][j],0);
if(k>=3) {
if((k==3&&flag>=1)||(k==4&&flag>=2))
// 如果长度==3,且转过1次向 或 如果长度==4,且转过2次向 , 跳出
break;
else
ans++;
}
// cout<<"\n";
// for(int i=1; i<=n; i++) {
// for(int j=1; j<=m; j++)
// cout<<a[i][j];
// cout<<"\n";
// }
}
printf("%d",ans);
return 0;
}