通过队列
BFS版本
#include <iostream> #include <set> #include <vector> #include <cmath> #include <cstdio> #include <algorithm> #include <queue> #define ll long long const int M = 1e3 + 1; using namespace std; int a[M][M]; int n, m; int x1[M] = { 0,0,-1,1,0 }; int yt[M] = { 0,1,0,0,-1 }; queue<int> v, u; inline void dfs(int x, int y) { int dx, dy; a[x][y] = 0; for (int i = 1; i <= 4; i++) { dx = x1[i] + x; dy = yt[i] + y; if (dx >= 1 && dx <= n && dy >= 1 && dy <= m && a[dx][dy] != 0) { dfs(dx, dy); } } } int main() { cin >> n >> m; for (int i = 1; i <= n; i++) { for (int j = 1; j <= m; j++) { scanf("%1d",&a[i][j]) //注意这里是输入一个数字,要限定一个数字,不然会出错的 } } int ans = 0; for (int i = 1; i <= n; i++) { for (int j = 1; j <= m; j++) { if (a[i][j] != 0) { v.push(i), u.push(j); while (!v.empty()) { dfs(v.front(), u.front()); v.pop(), u.pop(); } ans++; } } } cout << ans << endl; }
DFS #include<cstdio> using namespace std; char a[101][101]; int ans; int n,m; void dfs(int x,int y){ a[x][y]='.'; int dx,dy; for(int i=-1;i<=1;i++){ for(int j=-1;j<=1;j++){ dx=x+i; dy=y+j; if(dx>=0&&dx<=n&&dy>=0&&dy<m&&a[dx][dy]=='W'){ dfs(dx,dy); } } } return; } int main(){ scanf("%d%d",&n,&m); for(int i=0;i<=n;i++){ scanf("%s",a[i]);//避免换行带来问题这里直接读入字符串 } for(int i=0;i<=n;i++){ for(int j=0;j<m;j++){ if(a[i][j]=='W'){//如果是W的话就直接开始遍历 dfs(i,j); ans++;//水潭加一处 } } } printf("%d",ans); return 0; }