4 条题解

  • 0
    @ 2024-1-19 14:48:20
    #include <bits/stdc++.h>
    using namespace std;
    int n,m,sum;
    char a[100][100];
    //定义方向
    int fx[10]={0,0,1,0,-1,1,-1,1,-1};
    int fy[10]={0,1,0,-1,0,-1,1,1,-1};
    //递归求解池塘个数
    void fun(int x,int y){
        a[x][y]='.';//初始化x,y点
        for (int i=1;i<=8;i++){
            int tx=x+fx[i];
            int ty=y+fy[i];
            //递归
            if (a[tx][ty]=='W')fun(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++){
                //判断a[i][j]是否是池塘
                if (a[i][j]=='W'){
                    sum++;
                    fun(i,j);
                }
            }
        }
        //输出
        cout<<sum;
        return 0;
    }
    
    • 0
      @ 2023-8-15 16:56:35

      这题很简单,把P431的代码搬过来,然后修改判断条件即可,dfs部分如下:(Python)

      def dfs(x,y):
          global tab
          node=[[0,1],[1,0],[-1,0],[0,-1],[1,1],[-1,-1],[1,-1],[-1,1]]
          tab[x][y]='.'
          for i in node:
              tx=x+i[0]
              ty=y+i[1]
              if tx<0 or tx > a-1 or ty < 0 or ty >b-1:
                  continue
              if tab[tx][ty] == 'W' and not vis[tx][ty]:
                  vis[tx][ty]=1
                  dfs(tx,ty)
          return
      
      • 0
        @ 2023-1-18 10:29:47

        本题要求输出池塘的个数。实际上,如果有一个地方有水但是没被之前的bfs搜索到,那么就可以认为这是一个新池塘,sum++, 并把这个池塘进行bfs,标记一下。

        #include <bits/stdc++.h>
        using namespace std;
        struct Point{
            int x, y;
        };
        queue<Point> q;
        int n, m, dx[8]={-1, 0, 1, -1, 1, -1, 0, 1}, dy[8]={-1, -1, -1, 0, 0, 1, 1, 1}, diff[105][105], sum;
        char a[105][105];
        void bfs(int w, int h){
            q.push((Point){w, h});
            while (q.size()){
                Point now = q.front();
                q.pop();
                for (int i = 0; i < 8; i++){/*遍历8个方向*/
                    int nx = now.x + dx[i], ny = now.y + dy[i];
                    if (nx>=1&&nx<=n&&ny>=1&&ny<=m&&a[nx][ny]=='W'&&!diff[nx][ny]){
                        diff[nx][ny] = 1;
                        q.push((Point){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];
            for (int i = 1; i <= n; i++)
                for (int j = 1; j <= m; j++)
                    if (a[i][j] == 'W' && !diff[i][j]){/*发现新池塘*/
                        bfs(i, j);
                        sum++;
                    }
            cout << sum;
            return 0;
        }
        
        • -2
          @ 2022-4-24 17:50:51

          写题解请注意

          鼓励大家写题解,但注意题解格式。

          题解一定要有思路解析或代码注释,能否让别人理解你的思路

          也是你的能力的检验,不要只放无意义的代码给大家复制,那就失去了做题的初心。

          给代码两端加上这个会舒服一些

          ```cpp

          你的代码

          ```

          </span>

          这个点在键盘的左上角tab上面那个键,注意切换输入法

          #include<iostream>
          using namespace std;
          int main()
          {
              int n;
              cin>>n;//这是一个注释
              return 0;
          } 
          

          请注意严禁抄袭题解,写题解不要只放代码,需加上你的思路或代码注释。

          抄袭题解一经发现直接取消成绩。

          题解被删除的可能

          1. 代码不符合格式规范
          2. 没有思路讲解或者没有注释,
          3. 无意义的题解

          大家携手共同维护一个良好的编程环境,如果一经发现,多次作乱。可能会被管理员拉黑,请注意,一旦拉黑即失去登陆资格。

          • 1

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

          信息

          ID
          432
          时间
          1000ms
          内存
          128MiB
          难度
          1
          标签
          递交数
          48
          已通过
          41
          上传者