Problem solution :
This question DFS is clear that, from the upper left corner to find tmpSum = sum / 2, then the minimum number of grid recorded, to the final output.
Code :
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cmath>
#include <climits>
#include <cstring>
#include <string>
#include <algorithm>
#include <vector>
#include <deque>
#include <list>
#include <utility>
#include <set>
#include <map>
#include <stack>
#include <queue>
#include <bitset>
#include <iterator>
using namespace std;
typedef long long ll;
const int inf = 0x3f3f3f3f;
const ll INF = 0x3f3f3f3f3f3f3f3f;
const double PI = acos(-1.0);
const double E = exp(1.0);
const int MOD = 1e9+7;
const int MAX = 10+5;
int m,n;
int a[MAX][MAX];
int flag[MAX][MAX];
int sum = 0;
int minNum = inf;
int dir[4][4] = {{-1,0},{1,0},{0,-1},{0,1}};
// tmp:当前遍历到的和,tmpNum:当前遍历到的数的个数
// (i,j)当前遍历到的点
void dfs(int tmp,int tmpNum,int i,int j)
{
if(tmp == sum/2)
{
minNum = min(minNum,tmpNum);
return;
}
for(int k = 0; k < 4; k++)
{
int x = i + dir[k][0];
int y = j + dir[k][1];
if(! (x < 0 || x >= n || y < 0 || y >= m || flag[x][y]) )
{
flag[x][y] = 1;
dfs(tmp+a[x][y],tmpNum+1,x,y);
flag[x][y] = 0;
}
}
}
int main()
{
/*
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
*/
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];
}
}
//memset(flag,0,sizeof(flag));
dfs(a[0][0],1,0,0);
cout << minNum << endl;
return 0;
}