top1编程
← 返回题目
题解

【基础】数池塘(八方向)

3 条题解

  • 0
    @ 2026-7-29 20:22:18
    #include <bits/stdc++.h>
    using namespace std;
    int n, m; char a[105][105];
    int dx[8] = {1, -1, 0, 0, 1, 1, -1, -1};
    int dy[8] = {0, 0, 1, -1, 1, -1, 1, -1};
    void dfs(int x, int y) {
        a[x][y] = &#39;.&#39;;
        for (int i = 0; i < 8; i++) {
            int nx = x + dx[i], ny = y + dy[i];
            if (nx >= 1 && nx <= n &&
                ny >= 1 && ny <= m && a[nx][ny] == &#39;W&#39;)
                dfs(nx, ny);
        }
    }
    int main() {
        cin >> n >> m;
        for (int i = 1; i <= n; i++)
            for (int j = 1; j <= m; j++) cin >> a[i][j];
        int ans = 0;
        for (int i = 1; i <= n; i++)
            for (int j = 1; j <= m; j++)
                if (a[i][j] == &#39;W&#39;) { ans++; dfs(i, j); }
        cout << ans;
    }
    
    • 0
      @ 2026-7-29 0:06:21
      #include <bits/stdc++.h>
      using namespace std;
      int n, m; char a[105][105];
      int dx[8] = {1, -1, 0, 0, 1, 1, -1, -1};
      int dy[8] = {0, 0, 1, -1, 1, -1, 1, -1};
      void dfs(int x, int y) {
          a[x][y] = '.';
          for (int i = 0; i < 8; i++) {
              int nx = x + dx[i], ny = y + dy[i];
              if (nx >= 1 && nx <= n &&
                  ny >= 1 && ny <= m && a[nx][ny] == 'W')
                  dfs(nx, ny);
          }
      }
      int main() {
          cin >> n >> m;
          for (int i = 1; i <= n; i++)
              for (int j = 1; j <= m; j++) cin >> a[i][j];
          int ans = 0;
          for (int i = 1; i <= n; i++)
              for (int j = 1; j <= m; j++)
                  if (a[i][j] == 'W') { ans++; dfs(i, j); }
          cout << ans;
      }
      
      • 0
        @ 2026-7-28 22:09:22
        #include<bits/stdc++.h>
        using namespace std;
        char a[110][110];
        int n,m,s=0;
        //下右上左 左上 右上 右下 左下
        int fx[10]={0,1,0,-1,0,1,1,-1,-1};
        int fy[10]={0,0,1,0,-1,-1,1,1,-1};
        void f(int x,int y){
        	a[x][y]='.';//吸干水分
        	for(int i=1;i<=8;i++){//遍历八个方向的情况
        		int tx=fx[i]+x;
        		int ty=fy[i]+y;
        		if(a[tx][ty]=='W'&&tx>=1&&tx<=n&&ty>=1&&ty<=m){//如果有水洼
        			f(tx,ty);//通过递归吸干
        		}
        	}
        }
        int main(){
        	
        	cin>>n>>m;
        	for(int i=1;i<=n;i++){
        		for(int j=1;j<=m;j++){
        			cin>>a[i][j];//读入农场每个点的情况
        		}
        	}
        	for(int i=1;i<=n;i++){
        		for(int j=1;j<=m;j++){
        			if(a[i][j]=='W'){//判断是水洼
        				s++;//池塘数目+1
        				f(i,j);//递归相邻的水洼
        			}
        		}
        	}
        	cout<<s;
        	return 0;
        }
        
        • 1