不同与一般的dfs本题是求最大连通块(而不是路径之类的),因此标记之后不需要回溯,请看代码:
#include<bits/stdc++.h>
using namespace std;
#define MAX 103
int n,m;
char a[MAX][MAX];
int mark[MAX][MAX]; //标记是否走过某个节点
const int dx[]={1,1,1,0,0,-1,-1,-1};//方向数组
const int dy[]={1,0,-1,-1,1,1,0,-1};
bool check(int newx,int newy){
if(newx>=n||newx<0||newy>=m||newy<0||mark[newx][newy]||a[newx][newy]!='W')
return false;
return true;
}
void dfs(int x,int y){
mark[x][y]=1;
for(int i=0;i<8;i++){
int newx=x+dx[i];
int newy=y+dy[i];
if(check(newx,newy)){
dfs(newx,newy);
//不需要mark[newx][newy]=0;
}
}
}
int main(void){
int cnt=0;
cin>>n>>m;
for(int i=0;i<n;i++){
cin>>a[i];
}
for(int i=0;i<n;i++){
for(int j=0;j<m;j++){
if(a[i][j]=='W'&&mark[i][j]==0){
dfs(i,j);
cnt++;
}
}
}
cout<<cnt<<endl;
}
另外,dfs的一般模板:洛谷P1238 走迷宫(dfs)
这个代码在求最大连通块时非常好用,大家可以收藏起来以备不时之需