#include<iostream> #include<cstring> #include<iomanip> #include<cmath> #include<algorithm> #include<bits/stdc++.h> using namespace std; int N, M; int num = INT_MAX, sum = 0; int A[10][10]; bool visit[10][10]; bool outOfBorder(int i, int j) { if (i < 0 || i >= N || j < 0 || j >= M) return true; return false; } void DFS(int i, int j, int currentSum, int currentNum) { visit[i][j] = true; currentSum += A[i][j]; ++currentNum; if (2 * currentSum >= sum) { if (2 * currentSum == sum)// 如果当前遍历过的数字之和等于所有数字之和的一半 num = min(currentNum, num);// 更新包含左上角格子的那个区域包含的格子的最小数目 visit[i][j] = false; return;// 回溯到上一结点 } if (!outOfBorder(i, j + 1) && !visit[i][j + 1])// 向右移动 DFS(i, j + 1, currentSum, currentNum); if (!outOfBorder(i + 1, j) && !visit[i + 1][j])// 向下移动 DFS(i + 1, j, currentSum, currentNum); if (!outOfBorder(i, j - 1) && !visit[i][j - 1])// 向左移动 DFS(i, j - 1, currentSum, currentNum); if (!outOfBorder(i - 1, j) && !visit[i - 1][j])// 向上移动 DFS(i - 1, j, currentSum, currentNum); visit[i][j] = false; } int main(){ cin>>M>>N; for (int i = 0; i < N; ++i) for (int j = 0; j < M; ++j) { cin>>A[i][j]; sum += A[i][j]; } DFS(0,0,0,0); if (num == INT_MAX) printf("0");// 输出0 else printf("%d",num); return 0; }