解题思路
1.深搜或者广搜
2.并查集
版本2
这是挑战编程竞赛里的版本,如果数据范围较大,需要使用BFS
#include <iostream>
#include <cstring>
#include <cstdio>
using namespace std;
const int N = 1005;
char g[N][N];
int n, m;
int ans = 0;
void dfs(int u, int v){
g[u][v] = '.';
for(int i = -1; i <= 1; i++ )
for(int j = -1; j <= 1; j++){
int a = u+i, b = v+j;
if(a>=0&&a<n&&b>=0&&b<m&&g[a][b]=='W') dfs(a, b);
}
}
int main(){
scanf("%d%d", &n, &m);
for(int i = 0; i < n; i++){
scanf("%s", g[i]);
}
for(int i = 0; i < n; i++){
for(int j = 0; j < m; j++){
if(g[i][j]=='W') {
ans++;
dfs(i, j);
}
}
}
printf("%d\n", ans);
return 0;
}
版本1
#include<cstdio>
#include<iostream>
#include<algorithm>
#include<string>
#include<vector>
using namespace std;
char arr[105][105];
int x,y;
void dfs(int u,int v){
if(u<0||u>=x||v<0||v>=y||arr[u][v]=='.') return; //这里要先判断越界与否再判断是否为0
arr[u][v]='.';
for(int i=-1;i<2;i++){
for(int j=-1;j<2;j++){
if(i==0&&j==0) continue;
else dfs(u+i,v+j);
}
}
}
int main(){
cin>>x>>y;
for(int i=0;i<x;i++){
for(int j=0;j<y;j++){
cin>>arr[i][j];
}
}
int count=0;
for(int i=0;i<x;i++){
for(int j=0;j<y;j++){
if(arr[i][j]=='W'){
count++;
dfs(i,j);
}
}
}
cout<<count<<endl;
return 0;
}