题面:给定一个N*M的区域,如果是W代表有水。水是可以八个方向联通的,问有多少个连通块。
想法:简单的dfs。首先循环判断每个点可不可以走(符号是’W’的先前没有访问过的格子),然后进行深搜(考虑往四面八方走)。
书中给的想法是不用vis记录状态,走过的W直接变成.。
code:
#include <iostream>
#include <cstdio>
using namespace std;
int n,m;
int cnt;
char maze[1010][1010];
bool vis[1010][1010];
bool jud(int x,int y){
if(x<0||y<0||x>=n||y>=m) return false;
if(vis[x][y]) return false;
if(maze[x][y]=='.') return false;
return true;
}
void dfs(int i,int j){
// if(maze[i][j]=='.') return;
// if(vis[i][j]) return;
vis[i][j]=true;
for(int dx=-1;dx<=1;++dx){
for(int dy=-1;dy<=1;++dy){
if(jud(i+dx,j+dy)) dfs(i+dx,j+dy);
}
}
}
int main()
{
scanf("%d%d",&n,&m);
for(int i=0;i<n;++i){
scanf("%s",maze[i]);
}
for(int i=0;i<n;++i){
for(int j=0;j<m;++j){
if(maze[i][j]=='.') continue;
if(vis[i][j]) continue;
cnt++;
dfs(i,j);
}
}
printf("%d\n",cnt);
return 0;
}
不知不觉之前又玩了好几天,希望能够抓紧恢复学习状态。