剪格子算法
如图p1.jpg所示,3 x 3 的格子中填写了一些整数。
我们沿着图中的红色线剪开,得到两个部分,每个部分的数字和都是60。
本题的要求就是请你编程判定:对给定的m x n 的格子中的整数,是否可以分割为两个部分,使得这两个区域的数字和相等。
如果存在多种解答,请输出包含左上角格子的那个区域包含的格子的最小数目。
如果无法分割,则输出 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
#include<stdio.h>
bool a[10][10];
int arr[10][10];
int m, n, total, ans = 100;
void find(int i,int j,int sum,int cnt){
if(sum == total / 2){
ans = cnt < ans ? cnt : ans;
return ;
}
if(sum > total / 2) return ;
a[i][j] = true;
if(i + 1 < n && !a[i + 1][j]) find(i + 1, j, sum + arr[i][j], cnt + 1);
if(i > 0 && !a[i - 1][j]) find(i - 1, j, sum + arr[i][j], cnt + 1);
if(j + 1 < m && !a[i][j + 1]) find(i, j + 1, sum + arr[i][j], cnt + 1);
if(j > 0 && !a[i][j - 1]) find(i, j - 1, sum + arr[i][j], cnt + 1);
a[i][j] = false;
}
int main(){
scanf("%d %d",&m,&n);
for(int i = 0; i < n;i++)
for(int j = 0;j < m;j++){
scanf("%d",&arr[i][j]);
total += arr[i][j];
}
find(0,0,0,0);
if(ans == 100)
printf("0");
else
printf("ans的值为:%d",ans);
return 0;
}
踩坑提示:
1.在递归时判断是否已经经过了某个坐标的flag,应该定义成矩阵形式
2.注意变量定义的位置,千万要弄清全局变量和局部变量
3.c语言比较两个数字的大小,可以用三目运算符