5 条题解

  • 3
    @ 2022-12-6 8:48:32

    这是一道基础深度优先搜索

    众所周知,深搜分为以下几个步骤:

    1.判断边界

    2.尝试每一种可能

    3.继续下一步(递归)

    废话不多说上代码:

    #include <iostream>
    using namespace std;
    int sum , n , m , b[105][105] , next[4][2] = {{0 , 1} , 
                                                  {1 , 0} , 
                                                  {0 , -1} , 
                                                  {-1 , 0}};
    char map[105][105];
    void dfs(int x , int y)
    {
        int tx , ty;
        b[x][y] = 1;
        for (int i = 0 ; i < 4 ; i++)
        {
            tx = x + next[i][0];
            ty = y + next[i][1];
            if (tx < 1 || tx > n || ty < 1 || ty > m) continue;
            if (map[tx][ty] == 'W' && b[tx][ty] == 0)
            {
                b[tx][ty] = 1;
                dfs(tx , ty);
            }
        }
        return;
    }
    
    int main()
    {
        cin >> n >> m;
        for (int i = 1 ; i <= n ; i++)
        {
            string row;//这里关于输入说一句。因为输入是没有空格,所以要先输入整行,再在字符串里遍历
            cin >> row;
            for (int j = 0 ; j < m ; j++)
            {
                map[i][j + 1] = row[j];//赋值时千万不要忘记j+1
            }
        }
    
        for (int i = 1 ; i <= n ; i++)
        {
            for (int j = 1 ; j <= m ; j++)
            {
                if (map[i][j] == 'W' && b[i][j] == 0)
                {
                    sum++;
                    dfs(i , j);
                }
            }
        }
        cout << sum;
        return 0;
    }
    
    • @ 2022-12-7 9:48:30

      其输入那里不用那么复杂,直接输入即可

  • 2
    @ 2023-4-19 19:51:37

    漫水

    #include<bits/stdc++.h>
    using namespace std;
    int n,m,x[4]={0,0,1,-1},y[4]={1,-1,0,0},ans;
    char c[107][107];
    void awa(int sx,int sy)
    {
        c[sx][sy]='.';
        for (int i=0;i<4;i++)
        {
            int nx=sx+x[i],ny=sy+y[i];
            if (nx>=1&&nx<=n&&ny>=1&&ny<=m&&c[nx][ny]=='W')
            {
                awa(nx,ny);
            }
        }
    }
    int main()
    {
        cin>>n>>m;
        string s;
        for (int i=1;i<=n;i++)
        {
            cin>>s;
            for (int j=1;j<=m;j++)
                c[i][j]=s[j-1];
        }
        for (int i=1;i<=n;i++)
            for (int j=1;j<=m;j++)
                if (c[i][j]=='W')
                {
                    ans++;
                    awa(i,j);
                }
        cout<<ans;
        return 0;
    }
    • 1
      @ 2023-8-15 16:54:39

      嗨嗨嗨,我又来了. 今天咱们讲一讲P431.[基础]数池塘(四方向)


      思路

      这个题目我一开始是用BFS,可是我本人技术菜鸡至极,愣是没做出来,只好去找大佬"参考"代码。 思路如下: 首先,寻找池塘。 其次,如果找到一个池塘,就对其进行DFS,看看能否扩大池塘面积。并且每扩大一次面积就"抽干"这个池塘的水(对于一开始的那个池塘也是如此,表现为vis[x][y]=1,即到过这个池塘) 重复这两步,直到边界条件。


      代码

      def dfs(x,y):
          global tab
          node=[[0,1],[1,0],[-1,0],[0,-1]]#右,下,上,左
          tab[x][y]='.'#抽走水,不把其再算成池塘。
          for i in range(4):
              tx=x+node[i][0]
              ty=y+node[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 #已经到边界或已经没有池塘可供扩展了,结束搜索
      a,b=list(map(int,input().split()))
      tab=[]
      cnt=0
      vis=[]
      for i in range(a):
          mid=[0]*b
          vis.append(mid)#初始化vis数组
      for i in range(a):
          tab.append(list(input()))
      for i in range(a):
          for j in range(b):
              if tab[i][j] == 'W':
                  cnt+=1#找到一个池塘,计数
                  vis[i][j]=1
                  dfs(i,j)
      print(cnt)
      

      Loading:30/100……^_^

      • 0
        @ 2023-8-23 21:47:05

        #include<bits/stdc++.h>

        using namespace std;

        int fxx[9]={0,0,1,-1};

        int fxy[9]={1,-1,0,0};

        int n,m,ans;

        char a[105][105];

        void dfs(int x,int y){

        int r,c;

        a[x][y]='.';

        for (int i=0;i<4;i++){

        r=x+fxx[i];

        c=y+fxy[i];

        if(r<1||r>n||c<1||c>m||a[r][c]=='.')continue;

        a[r][c]='.';

        dfs(r,c);

        }

        }

        int main(){

        cin >> n >> m;

        for (int i=1;i<=n;i++){

        for (int j=1;j<=m;j++)cin>>a[i][j];

        }

        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;

        return 0;

        }

        一个很简单的深搜,广搜也可以,但是很难,因为我不会广搜,尴尬,,ԾㅂԾ,,(ˉ▽ˉ;)...请留赞再走谢谢🌹🌹🌹❤❤❤

        • -1
          @ 2022-4-24 17:50:44

          写题解请注意

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

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

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

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

          ```cpp

          你的代码

          ```

          </span>

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

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

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

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

          题解被删除的可能

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

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

          • 1

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

          信息

          ID
          431
          时间
          1000ms
          内存
          16MiB
          难度
          3
          标签
          递交数
          134
          已通过
          76
          上传者