DFS遍历连通块问题
eg1
#include <bits/stdc++.h>
using namespace std;
#define int long long
const int N=45;
int vis[N][N],sum;
char g[N][N];
int dx[]={1,0,-1,0},dy[]={0,1,0,-1};
void dfs(int x,int y){
if(x<1||x>30||y<1||y>40||vis[x][y]==2||g[x][y]=='1')return;
vis[x][y]=2;
sum++;
for(int i=0;i<4;i++){
int tx=x+dx[i],ty=y+dy[i];
dfs(tx,ty);
}
}
signed main(){
for(int i=1;i<=30;i++)
for(int j=1;j<=40;j++)cin>>g[i][j];
dfs(1,1);
cout<<sum;
return 0;
}
eg2
#include <bits/stdc++.h>
using namespace std;
#define int long long
const int N=1009;
int n,m,r,c,ans,g[N][N],vis[N][N];
int dx[]={0,1,0,-1},dy[]={1,0,-1,0};
void dfs(int x,int y){
if(x<1||x>n||y<1||y>m||vis[x][y])return;
vis[x][y]=1;
ans++;
for(int i=0;i<4;i++){
int tx=x+dx[i],ty=y+dy[i];
if(__gcd(g[x][y],g[tx][ty])>1)dfs(tx,ty);
}
}
signed main(){
cin>>n>>m;
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)cin>>g[i][j];
cin>>r>>c;
dfs(r,c);
cout<<ans;
}