20pts求解
查看原帖
20pts求解
1243869
sll00楼主2024/4/11 16:45

传送门

没写dfs直接双重循环遍历都没超时就是wa了..

结构上很明白就是一个一个找然后加到ans里面,求大佬帮忙看看orz

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
#define For(i,l,r) for(int i=(int)(l);i<=(int)(r);i++)
#define Refor(i,r,l) for(int i=(int)(r);i>=(int)(l);i--)
#define maxn 10005
bool arr[maxn][maxn];
ll brr[maxn][maxn];
bool vis[maxn][maxn];
int dx[]={0,1,0,-1,0,1,1,-1,-1};
int dy[]={0,0,1,0,-1,1,-1,1,-1};
int main()
{
    ios::sync_with_stdio(0);
    cin.tie(0),cout.tie(0);
    ll n,m;
    cin>>n>>m;
    ll ans=0;
    //输入和处理数字
    //brr中数字是周围雷数量,-1表示雷,0表示周围空
    For(i,1,n)
    {
        For(j,1,m)
        {
            cin>>arr[i][j];
             if(arr[i][j])
            {
                brr[i][j]=-1;
                int x=0,y=0;
                For(k,1,8)
                {
                    x=i+dx[k];
                    y=j+dy[k];
                    if(x>0&&x<=n&&y>0&&y<=m&&!arr[x][y])
                    {
                        brr[x][y]++;
                    }
                }
            }
        }
    }
    //找没有空格的数字
    For(i,1,n)
    {
        For(j,1,m)
        {
            bool flag=true;
            if(brr[i][j]>=1)
            {
                For(k,1,8)
                {
                    int x=i+dx[k];
                    int y=j+dy[k];
                    if(x>0&&x<=n&&y>0&&y<=m&&brr[x][y]==0)
                    {
                        flag=false;
                        break;
                    }
                }
                if(flag)
                {
                    ans++;
                }
            }
        }
    }
    //找空并标记
    For(i,1,n)
    {
        For(j,1,m)
        {
             if(brr[i][j]==0)
            {
                bool now=0;
                For(k,1,8)
                {
                    int x=i+dx[k];
                    int y=j+dy[k];
                    if(x>0&&x<=n&&y>0&&y<=m&&brr[x][y]!=0)
                    {
                        now=1;
                    }
                }
                if(!now)
                {
                    For(k,1,8)
                    {
                        int x=i+dx[k];
                        int y=j+dy[k];
                        if(x>0&&x<=n&&y>0&&y<=m)
                        {
                            brr[x][y]--;
                        }
                    }
                    ans++;
                }
            }
        }
    }
    cout<<ans<<endl;
    return 0;
}


2024/4/11 16:45
加载中...