剪格子

来源:互联网 发布:js特殊字符转义 编辑:程序博客网 时间:2024/04/28 21:54

如图p1.jpg所示,3 x 3的格子中填写了一些整数。


    我们沿着图中的红色线剪开,得到两个部分,每个部分的数字和都是60。

    本题的要求就是请你编程判定:对给定的m x n的格子中的整数,是否可以分割为两个部分,使得这两个区域的数字和相等。

    如果存在多种解答,请输出包含左上角格子的那个区域包含的格子的最小数目。  

    如果无法分割,则输出 0

 

程序输入输出格式要求:

程序先读入两个整数 m n 用空格分割(m,n<10)

表示表格的宽度和高度

接下来是n行,每行m个正整数,用空格分开。每个整数不大于10000

程序输出:在所有解中,包含左上角的分割区可能包含的最小的格子数目。

 

例如:

用户输入:

3 3

10 152

20 301

1 2 3

 

则程序输出:

3

 

再例如:

用户输入:

4 3

1 1 11

1 3080 2

1 1 1100

 

则程序输出:

10

 

(参见p2.jpg)


 

资源约定:

峰值内存消耗< 64M

CPU消耗  < 5000ms

 

 

请严格按要求输出,不要画蛇添足地打印类似:“请您输入...”的多余内容。

 

所有代码放在同一个源文件中,调试通过后,拷贝提交该源码。

 

注意: main函数需要返回0

注意: 只使用ANSI C/ANSI C++标准,不要调用依赖于编译环境或操作系统的特殊函数。

注意: 所有依赖的函数必须明确地在源文件中#include <xxx>, 不能通过工程设置而省略常用头文件。

 

提交时,注意选择所期望的编译器类型。

#include <stdio.h>#include<stdlib.h>int**a,**b,sum,m,n,x;void backtrack(int i,int j){int k,h;if(i<0||j<0||i>=m||j>=n||b[i][j]||sum<0)return;if(sum==0){x=0;for(k=0;k<m;k++){for(h=0;h<n;h++){if(b[k][h]==b[0][0]){x++;}}}printf("%d\n",x);exit(0);}else{sum-=a[i][j];b[i][j]=1;backtrack(i,j-1);backtrack(i-1,j);backtrack(i,j+1);backtrack(i+1,j);sum+=a[i][j];b[i][j]=0;}}int main(int argc, char* argv[]){int i,j;scanf("%d%d",&m,&n);a=(int**)malloc(sizeof(int*)*m);b=(int**)malloc(sizeof(int*)*m);sum=0;for(i=0;i<m;i++){a[i]=(int*)malloc(sizeof(int)*n);b[i]=(int*)malloc(sizeof(int)*n);for(j=0;j<n;j++){b[i][j]=0;scanf("%d",a[i]+j);sum+=a[i][j];}} sum/=2;for(i=0;i<m;i++)for(j=0;j<n;j++)backtrack(i,j);return 0;}

测试结果:


0 0
原创粉丝点击