1 条题解

  • 27
    @ 2023-8-20 17:48:02

    转变思路

    其实这题很简单,我们只要用一个深搜(广搜)即可,只不过需要一点变化。

    • 我第一时间想到的是在(1,1)处用一个深搜。

    • 因为1内部的点很难找,外部的点还不好找吗?

    • 将深搜搜到的地方都变成一,如果遇到1(墙)就不搜。但是,这个想法不到10秒就被我否决了,为什么呢?

    • 我用第一个测试点举例:

      0 1 1 1 1 1 1 1 1 0
      1 0 0 0 0 0 0 0 0 1
      1 0 0 0 0 0 0 0 0 1
      1 0 0 0 0 0 0 0 0 1
      1 0 0 0 0 0 0 0 0 1
      1 0 0 0 0 0 0 0 0 1
      1 0 0 0 0 0 0 0 0 1
      1 0 0 0 0 0 0 0 0 1
      1 0 0 0 0 0 0 0 0 1
      0 1 1 1 1 1 1 1 1 0
      

      显然,这个方法过不了这个测试点,因为墙外(1)的部分不止一个,所以不行。

      • 难道我们这个思想错了吗?不,只要变换一下就可以了。我们可以把第一个样例变成这样:
        0 0 0 0 0 0 0 0 0 0 0 0
        0 0 1 1 1 1 1 1 1 1 0 0
        0 1 0 0 0 0 0 0 0 0 1 0
        0 1 0 0 0 0 0 0 0 0 1 0
        0 1 0 0 0 0 0 0 0 0 1 0
        0 1 0 0 0 0 0 0 0 0 1 0
        0 1 0 0 0 0 0 0 0 0 1 0
        0 1 0 0 0 0 0 0 0 0 1 0
        0 1 0 0 0 0 0 0 0 0 1 0
        0 1 0 0 0 0 0 0 0 0 1 0
        0 0 1 1 1 1 1 1 1 1 0 0
        0 0 0 0 0 0 0 0 0 0 0 0
        

    这是不是就可以了,对,我们只要在输入样例的外围加一圈0,就可以将分开的外围块连起来。用我们这个思想就可以解这题。

    • 所以这道题目我们只用深搜(广搜)就可以解决。

    AC代码(求赞)

    #include <bits/stdc++.h>
    using namespace std;
    bool a[12][12];
    int cnt;
    int fx[5]={0,1,0,0,-1};
    int fy[5]={0,0,-1,1,0};
    void dfs(int x,int y)
    {//标准的深搜
        a[x][y]=1;
        for (int i=1;i<=4;i++)
        {
            int nx=x+fx[i];
            int ny=y+fy[i];//模拟往4个方向搜寻的过程。
            if (nx>=0 && ny>=0 && nx<=11 && ny<=11 && !a[nx][ny])
            {//标准的边界判断+判断是否遇到墙
                a[nx][ny]=1;//将能走到的地方变为1。
                dfs(nx,ny);
            }
        }
    }
    int main()
    {
        for (int i=1;i<=10;i++){
            for (int j=1;j<=10;j++){
                cin>>a[i][j];
            }
        }//输入数据。
        //由于我们只输入了1-10行1-10列,所以,
        //第0行0列、11行11列就是我们加的。
        dfs(0,0);//深搜。
        //此时,外围的0已经全部变为1了,所以,剩下的,只有内部的0。
        for (int i=1;i<=10;i++){
            for (int j=1;j<=10;j++){
                if (!a[i][j])
                    cnt++;//因为只剩内部的0,外部的0都变成1了,所以,统计0的个数即可。
            }
        }
        cout<<cnt;//输出0的个数。
        return 0;
    }
    
    • 1

    信息

    ID
    2056
    时间
    1000ms
    内存
    128MiB
    难度
    2
    标签
    (无)
    递交数
    118
    已通过
    75
    上传者