#include<bits/stdc++.h>
using namespace  std;
int n,m,ans,pd;
char g[1001][1001]; 
int  main( ) 
{
    cin>>n>>m;
    for (int i=1;i<=n;i++)
        for (int j=1;j<=m;j++)
            cin>>g[i][j];
    for (int i=1;i<=n;i++)
    {
        int ok=0;
        for (int j=1;j<=n;j++)
        {
            if (pd=0)
            {
                if (g[i][j]=='#')
                    ok=1;
                if (g[i-1][j+1]=='#')
                    ok=0;
                if (g[i-1][j]=='#')
                    ok=0;
                if (g[i-1][j-1]=='#')
                    ok=0;
                if (g[i+1][j+1]=='#')
                    ok=0;
                if (g[i+1][j-1]=='#')
                    ok=0;
                if (g[i+1][j]=='#')
                    ok=0;
                if (g[i][j+1]=='#')
                    ok=0;
                if (g[i][j-1]=='#')
                    ok=0;
                if (ok)
                    g[i][j]='.',pd=1;
            }
        }
    }
    if (pd=0)
        for (int i=1;i<=n;i++)
            for (int j=1;j<=m;j++)
                if (g[i][j]=='#')
                {
                    g[i][j]='.';
                    break;  
                }
    for (int i=1;i<=n;i++)
        for (int j=1;j<=m;j++)
            if (g[i-1][j]=='.' && g[i+1][j]=='.' && g[i][j+1]=='.' && g[i][j-1]=='.')
                ans++;
    cout<<ans;
    return 0;   
}

1 条评论

  • @ 2026-09-10 22:14:29

    提供一个思路:先遍历,求出f(i,j)对应位置的四个方向的障碍物的总数,保存在一个数组中,如果是荒地就用-1。统计出直接能开垦的荒地k。然后再次遍历,当遇到障碍物时,就将数组中四个位置的障碍物数-1,将新增的能开垦的荒地数保存在maxx中。如果遇到能开垦更多荒地的位置就替换。最后将k+maxx就行

  • 1

信息

ID
2884
难度
7
分类
(无)
标签
递交数
59
已通过
12
通过率
20%
上传者