#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;   
}

3 条评论

  • @ 2026-09-12 09:30:12
    #include<bits/stdc++.h>
    using namespace std;
    int a[1005][1005],m,n,cnt,maxx;
    int xc[5]={0,-1,1,0,0},yc[5]={0,0,0,-1,1}; 
    bool ok;
    int func(int x,int y)
    {
        return (a[x+1][y]-1==1)+(a[x][y+1]-1==1)+(a[x-1][y]-1==1)+(a[x][y-1]-1==1)+(a[x][y-1]!=-1&&a[x-1][y]!=-1&&a[x][y+1]!=-1&&a[x+1][y]!=-1);
    }
    int main()
    {
        ios::sync_with_stdio(0);
        cin.tie(0);cout.tie(0);
        cin>>n>>m;
        for (int i=1;i<=n;i++)
            for (int j=1;j<=m;j++)
            {
                char inp;
                cin>>inp;
                if (inp=='#')
                {
                    a[i][j]=-1;
                    for (int k=1;k<=4;k++)
                        if (a[i+xc[k]][j+yc[k]]!=-1) a[i+xc[k]][j+yc[k]]++;
                 } 
                else a[i][j]++;
            }
        for (int i=1;i<=n;i++)
            for (int j=1;j<=m;j++)
            {
                if (a[i][j]==1) cnt++;
                if (a[i][j]==-1) ok=1,maxx=max(maxx,func(i,j));
            }
        cout<<maxx+cnt;
        return 0;
    }
    

    洛谷AC

  • @ 2026-09-12 09:11:24
    #include<bits/stdc++.h>
    using namespace std;
    #define int long long
    int a[1005][1005],m,n,cnt,maxx;
    int xc[5]={0,-1,1,0,0},yc[5]={0,0,0,-1,1}; 
    bool ok=0;
    int func(int x,int y)
    {
        return (a[x+1][y]-1==1)+(a[x][y+1]-1==1)+(a[x-1][y]-1==1)+(a[x][y-1]-1==1);
    }
    signed main()
    {
        ios::sync_with_stdio(0);
        cin.tie(0);cout.tie(0);
        cin>>n>>m;
        for (int i=1;i<=n;i++)
            for (int j=1;j<=m;j++)
            {
                char inp;
                cin>>inp;
                if (inp=='#')
                {
                    a[i][j]=-1;
                    for (int k=1;k<=4;k++)
                        if (a[i+xc[k]][j+yc[k]]!=-1) a[i+xc[k]][j+yc[k]]++;
                 } 
                else a[i][j]++;
            }
        for (int i=1;i<=n;i++)
            for (int j=1;j<=m;j++)
            {
                if (a[i][j]==1) cnt++;
                if (a[i][j]==-1) ok=1,maxx=max(maxx,func(i,j));
            }
        if (ok)cout<<maxx+cnt+1;
        else cout<<cnt;
        return 0;
    }
    
    
    

    AC代码

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

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

  • 1

信息

ID
2884
难度
7
分类
(无)
标签
递交数
63
已通过
14
通过率
22%
上传者