2013-11-10 实验之剪格子游戏(数字分组思想)bug已消除版本见2013-11-24

题目:标题:剪格子
    如图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
(参见p2.jpg)

资源约定:
峰值内存消耗 < 64M
CPU消耗  < 5000ms




思想:数字分组思想,分好了,常规思路


程序实现:

#include<stdio.h>
#include<stdlib.h>

int rowNum;
int colNum;
int **dataValue;
int min = 10000;
int *seedsValue;

void exec_sum()
{
	int i;
	int sum1 = 0;
	int sum0 = 0;
	int has1 = 0;
	for(i = 0; i < rowNum * colNum; i++){
		if(seedsValue[i]){
			has1++;
			sum1 += dataValue[i /colNum][i % colNum];
		}else{
			sum0 += dataValue[i /colNum][i % colNum];
		}
	}
	if(sum1 == sum0){
		//printf("\n\nthis count%d\n", has1);
		/*for(i = 0; i < rowNum * colNum; i++){
			if(seedsValue[i]){
				printf("%d ", i);
			}
		}*/
		if(has1 < min){
			min = has1;
		}
	}
}

void fun(int count)
{
	if(count == rowNum * colNum){
		int i ;
		exec_sum();
		return;
	}
	seedsValue[count] = 0;
	 fun(count + 1);
	seedsValue[count] = 1;
	 fun(count + 1);
}

void input_data()
{
	scanf("%d %d", &colNum, &rowNum);
	int i;
	int j;
	seedsValue = (int *)malloc(sizeof(int) * rowNum * colNum);
	dataValue = (int **)malloc(sizeof(int*) * rowNum);
	for(i = 0; i < rowNum; i++){
		dataValue[i] = (int *)malloc(sizeof(int) * colNum);
		for(j = 0; j < colNum; j++){
			scanf("%d", &dataValue[i][j]);
		}
	}
}

void freeMem()
{
	free(seedsValue);
	int i;
	for(i = 0; i < rowNum; i++){
		free(dataValue[i]);
	}
	free(dataValue);
}

int main(void)
{
	 input_data();
	seedsValue[0] = 1;
	fun(1);
	if(min == 10000){
		min = 0;
	}
	printf("%d\n", min);
	freeMem();
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值