http://lx.lanqiao.cn/problem.page?gpid=T27
#include <bits/stdc++.h>
using namespace std;
int s[20][20];
bool v[20][20];
int dx[]={0,0,1,-1};
int dy[]={1,-1,0,0};
int num,ans;
int m,n;
bool ok(int x,int y,int res){
if(x>=1&&y>=1&&x<=n&&y<=m&&!v[x][y]&&res<=num/2)return 1;
return 0;
}
void dfs(int x,int y,int res,int cnt){
if(res==num/2){
ans=min(ans,cnt);
return;
}
for(int i=0;i<4;i++){
int nowx=x+dx[i];
int nowy=y+dy[i];
if(ok(nowx,nowy,res+s[nowx][nowy])){
v[nowx][nowy]=1;
dfs(nowx,nowy,res+s[nowx][nowy],cnt+1);
v[nowx][nowy]=0;
}
}
return;
}
int main(){
cin>>m>>n;
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
cin>>s[i][j];
num+=s[i][j];
}
}
if(num%2)cout<<"0"<<endl;
else{
//cout<<"yes"<<endl;
ans=INT_MAX;
v[1][1]=1;
dfs(1,1,s[1][1],1);
if(ans==INT_MAX)cout<<"0"<<endl;
else cout<<ans<<endl;
}
return 0;
}