#include <cstdio>
#include <iostream>
using namespace std;
#define MAX 15
int grid[MAX][MAX], queue[MAX*MAX], vis[MAX][MAX];
int mini = 99999, m, n;
//sum=0则成功,算为一种情况。tot为包含左上角的块数
void dfs(int a, int b, int sum, int tot)
{
//超出范围则直接返回
if(a>=n || a<0) return;
if(b>=m || b<0) return;
if(sum < 0) return;
if(sum == 0)
if(mini > tot)
{
mini = tot;
return;
}
vis[a][b] = 1;
//向四个方向搜索
if(vis[a][b+1] == 0) dfs(a, b+1, sum-grid[a][b+1], tot+1);
if(vis[a][b-1] == 0) dfs(a, b-1, sum-grid[a][b-1], tot+1);
if(vis[a+1][b] == 0) dfs(a+1, b, sum-grid[a+1][b], tot+1);
if(vis[a-1][b] == 0) dfs(a-1, b, sum-grid[a-1][b], tot+1);
vis[a][b] = 0;
}
int main(void)
{
//freopen("grid.in","r",stdin);
int sum=0;
scanf("%d %d",&m,&n);
for(int i=0; i<n; i++)
for(int j=0; j<m; j++)
{
scanf("%d",&grid[i][j]);
sum+=grid[i][j];
}
//如果是奇数,则不可行
if(sum%2 != 0)
{
printf("0\n");
return 0;
}
//从(0,0)开始搜索
dfs(0, 0, sum/2-grid[0][0], 1);
printf("%d\n",mini);
return 0;
}
搬运博客园代码添加链接描述