//
如果存在多种解答,请输出包含左上角格子的那个区域包含的格子的最小数目。 如果无法分割,则输出 0
程序输入输出格式要求: 程序先读入两个整数 m n 用空格分割 (m,n<10) 表示表格的宽度和高度 接下来是n行,每行m个正整数,用空格分开。每个整数不大于10000 程序输出:在所有解中,包含左上角的分割区可能包含的最小的格子数目。
例如: 用户输入: 3 3 10 1 52 20 30 1 1 2 3
则程序输出: 3
再例如: 用户输入: 4 3 1 1 1 1 1 30 80 2 1 1 1 100
则程序输出: 10
思路:
dfs
代码
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
int a[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 + a[row][col] <= s ) {
vis[row][col] = 1;
r = dfs(row, col, temp + a[row][col]);
if( r ){
return r + 1;
}
vis[row][col] = 0;
}
}
}
return 0;
}
int main()
{
memset(a, 0, sizeof(a));
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", &a[i][j]);
sum += a[i][j];
}
}
if(sum % 2 == 1) {
printf("0");
}
else {
s = sum / 2;
if(a[0][0] == s) {
printf("1");
}
else {
vis[0][0] = 1;
res = dfs(0, 0, a[0][0]);
printf("%d", res);
}
}
return 0;
}