算法思想:简单的DFS回溯,代码注释就不写了
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
int map[11][11];
int vis[11][11];
int m, n;
int sum = 0, s;
int dir[4][2] = {1, 0, 0, 1, -1, 0, 0, -1};
int res = 0;
int dfs(int x, int y, int temp)
{
if(temp == s) {
return 1;
}
int r = 0;
for(int i = 0; i < 4; i++) {
int row = x + dir[i][0];
int col = y + dir[i][1];
if(row >= 0 && row < n && col >= 0 && col < m) {
if( !vis[row][col] && temp + map[row][col] <= s ) {
vis[row][col] = 1;
r = dfs(row, col, temp + map[row][col]);
if( r ){
return r + 1;
}
vis[row][col] = 0;
}
}
}
return 0;
}
int main()
{
memset(map, 0, sizeof(map));
memset(vis, 0, sizeof(vis));
scanf("%d%d", &m, &n);
for(int i = 0; i < n; i++) {
for(int j = 0; j < m; j++) {
scanf("%d", &map[i][j]);
sum += map[i][j];
}
}
if(sum % 2 == 1) {
printf("0");
}
else {
s = sum / 2;
if(map[0][0] == s) {
printf("1");
}
else {
vis[0][0] = 1;
res = dfs(0, 0, map[0][0]);
printf("%d", res);
}
}
return 0;
}