求助
查看原帖
求助
590600
Kreado楼主2023/2/25 16:40
#include <bits/stdc++.h>
#define ll long long
using namespace std;
const ll Maxn=1e2+7;
ll n,m,a[Maxn][Maxn],ans=1e12,sum;
bool vis[Maxn][Maxn],vi[Maxn][Maxn];
inline bool check(ll x,ll y){
    return vis[x-1][y]||vis[x][y-1]||vis[x+1][y]||vis[x][y+1];
}
void freap(ll x,ll y){
    for(ll i=-1;i<=1;i++)
        for(ll j=-1;j<=1;j++){
            if(i==j||i==-j) continue;
            ll nx=x+i,ny=j+y;
            if(nx>=1&&nx<=m&&ny>=1&&ny<=n&&!vi[nx][ny]&&!vis[nx][ny]){
                vi[nx][ny]=1;
                freap(nx,ny);
            }
        }
}
inline bool tar(){
    memset(vi,0,sizeof vi);
    ll ans=0;
    for(ll i=1;i<=n;i++)
        for(ll j=1;j<=m;j++)
            if(!vi[i][j]&&!vis[i][j]){
                ans++;
                vi[i][j]=1;
                freap(i,j);
            }
    return ans==1;
}
void dfs(ll x,ll y,ll step,ll S){
    if(S>sum/2) return ;
    if(S==sum/2){
        if(tar()) ans=min(ans,step);
        return ;
    }
    for(ll i=1;i<=n;i++){
        for(ll j=1;j<=m;j++){
            if(vis[i][j]) continue;
            if(!check(i,j)) continue;
            vis[i][j]=1;
            dfs(i,j,step+1,S+a[i][j]);
            vis[i][j]=0;
        }
    }
}
int main(){
    scanf("%lld%lld",&m,&n);
    for(ll i=1;i<=n;i++)
        for(ll j=1;j<=m;j++)
            scanf("%lld",&a[i][j]),sum+=a[i][j];
    if(sum%2){
        printf("0");
        return 0;
    }
    vis[1][1]=1;
    dfs(1,1,1,a[1][1]);
    printf("%lld",ans);
    return 0;
}
/*
4 4
1 2 3 4
8 7 6 5
9 10 11 12
16 15 14 13
*/
2023/2/25 16:40
加载中...