1 条题解

  • 1
    @ 2024-5-24 19:20:25

    思路

    注意到数据范围很小,我们可以用搜索暴力解决。我们按照从左到右、从上到下的顺序一行一行逐个递归。如果一个数周围 88 个数都没被选过,我们就选择该数,并往下递归。然后不论该数是否选择,我们都要再按照不选的状态往下递归一次。

    AC Code

    #include<bits/stdc++.h>
    #define ll long long
    using namespace std;
    const ll N=10;
    ll t,n,m,a[N][N],ans,d[8][2]={1,-1,-1,0,-1,1,0,-1,0,1,1,-1,1,0,-1,-1};
    bool flag[N][N];
    void dfs(ll x,ll y,ll cnt){
        if(x==n+1){
            ans=max(ans,cnt);
            return;
        }
        bool bo=1;
        for(ll i=0;i<8;i++)
            if(flag[x+d[i][0]][y+d[i][1]]){
                bo=0;
                break;
            }
        if(bo){
            flag[x][y]=1;
            y==m?dfs(x+1,1,cnt+a[x][y]):dfs(x,y+1,cnt+a[x][y]);
            flag[x][y]=0;
        }
        y==m?dfs(x+1,1,cnt):dfs(x,y+1,cnt);
    }
    int main(){
        scanf("%lld",&t);
        for(ll i=1;i<=t;i++){
            ans=LLONG_MIN;
            scanf("%lld%lld",&n,&m);
            for(ll i=1;i<=n;i++)
                for(ll j=1;j<=m;j++)
                    scanf("%lld",&a[i][j]);
            dfs(1,1,0);
            printf("%lld\n",ans);
        }
        return 0;
    }
    
    • 1

    信息

    ID
    743
    时间
    1000ms
    内存
    125MiB
    难度
    5
    标签
    递交数
    135
    已通过
    51
    上传者