2 条题解

  • 5
    @ 2023-9-27 18:34:28

    em... 肿木说捏??

    这道题目,,的确只是考察了搜索,具体思路如下(本来是和某位dalao@ 一行 (2023liangweilin) 讨论的时候写的,这里由于lan,直接复制 粘贴大家么意见吧?!QAQ):

    • 如果地图某一点不为0(分为两种情况:1.本身是树 2.已经搜索过)进行搜索,方向:上/下/左/右(注意不要超出边界)
    #include<cstdio>
    using namespace std;
    
    char tent[1000];
    int map[1001][1001];  //存储地图数据
    int n, m;
    
    void findx(int x, int y){  //搜索函数
        if(!map[x][y]) return ;
    
        map[x][y] = 0;
    
        //对于此点 上/下/左/右 方向进行搜索(不能越界,注意判断条件)
        if(x > 1) findx(x-1, y);
        if(y > 1) findx(x, y-1);
        if(x < n) findx(x+1, y);
        if(y < m) findx(x, y+1);  //这里草率了awa,感谢 一行 的指正~~
    
        return ;
    }
    
    int main(){
    
        scanf("%d%d", &n, &m);
    
        for(int i=1; i<=n; i++){
            scanf("%s", tent);
            for(int j=1; j<=m; j++){
                map[i][j] = tent[j-1]-'0';  //由于题目奇奇怪怪的输入方式,这里只能这样存。。。
            }
        }
    
        int c=0;  //存储 猴群数
        for(int i=1; i<=n; i++){
            for(int j=1; j<=m; j++){
                if(map[i][j]){  //地图当前点不为0
                    findx(i, j);  //从当前点开始遍历查找
                    c++;  //猴群数 自增1
                }
            }
        }
    
        printf("%d\n", c);
    
        return 0;
    }
    

    END~

    • @ 2023-10-16 13:12:24

      双倍经验:

      注意含空格的输入,不会的可以参考本屑的另外一篇题解:题解

  • -2
    @ 2024-10-15 18:38:01

    血泪教训: 本题的数据是在windows下生成的,而评测系统却是Linux,两者在字符的处理上有些许不同,例如换行处理上。 我原本使用getchar(),由于上述原因无法通过,可以将矩阵的每行看成一个字符串,循环行数次,读入字符串暂时存储到字符数组里,这样就省了换行的处理,然后对字符串遍历,再对每个字符进行判断,最后再将信息转存到二维表里

    #include<iostream>
    #include<cstring>
    using namespace std;
    
    const int fx[10]={0,-1,1,0,0};
    const int fy[10]={0,0,0,1,-1};
    
    bool maps[1001][1001];
    char s [1001];
    int a[3][100001]; 
    int m,n;
    int sum=0;
    
    void bfs(int,int);
    
    int main()
    { scanf("%d%d",&m,&n);
      
      for(int i=1;i<=m;i++)
        { scanf("%s",s);
          for(int j=0;j<=n-1;j++)
            { if(s[j]!='0')
                maps[i][j+1]=1;
    		}
    	}
      for(int i=1;i<=m;i++)
        { for(int j=1;j<=n;j++)
            {
    		  if(maps[i][j])
                {
                	
    			 sum++;
    			 bfs(i,j);
                 
    			}
    		}
    	  
    	}
      printf("%d",sum);
      return 0;
    }
    
    void bfs(int x,int y)
    { 
      int head=0;
      int tail=1;
      a[1][1]=x;
      a[2][1]=y;
      maps[x][y]=0;
      do
      { head++;
        for(int i=1;i<=4;i++)
          { if(maps[a[1][head]+fx[i]][a[2][head]+fy[i]]!=0&&a[1][head]+fx[i]>=1&&a[1][head]+fx[i]<=m&&a[2][head]+fy[i]>=1&&a[2][head]+fy[i]<=n)
              { tail++;
    		    a[1][tail]=a[1][head]+fx[i];
    		    a[2][tail]=a[2][head]+fy[i];
    		    maps[a[1][tail]][a[2][tail]]=0;
    		  }
    	  }
      }while(head<tail);
    }
    
    
    • 1

    信息

    ID
    1566
    时间
    1000ms
    内存
    256MiB
    难度
    7
    标签
    递交数
    95
    已通过
    19
    上传者