蓝桥云课-剪格子
https://www.lanqiao.cn/problems/211/learning/
解题思路
记下矩阵总和,然后从<1,1>开始DFS,可以分成两份相等的,找最小份,如果越界直接返回
#include <bits/stdc++.h>
using namespace std;
int a[20][20];
int bk[20][20];
int n,m,sum,mix=400;
void dfs(int i,int j,int st,int s){
if(s==sum/2){//可以分成两份相等的,找最小份
mix=min(st,mix);
return ;
}
if((i<0||j<0||i>n||j>m)||bk[i][j])//越界直接返回
return;
bk[i][j]=1;
dfs(i+1,j,st+1,a[i][j]+s);
dfs(i-1,j,st+1,a[i][j]+s);
dfs(i,j+1,st+1,a[i][j]+s);
dfs(i,j-1,st+1,a[i][j]+s);
bk[i][j]=0;
return;
}
int main()
{
cin>>m>>n;
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
cin>>a[i][j];
sum+=a[i][j];
}
}
if(sum%2!=0){
cout<<0;
return 0;
}
dfs(1,1,0,0);
cout<<mix;
return 0;
}