找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 316|回复: 1

剪格子

[复制链接]

14

主题

65

回帖

0

积分

新手上路

积分
0
发表于 2013-6-24 23:40:39 | 显示全部楼层 |阅读模式
如图p1.jpg所示,3 x 3 的格子中填写了一些整数。
[attachment=388]
我们沿着图中的红色线剪开,得到两个部分,每个部分的数字和都是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)
[attachment=389]

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


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

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

注意: main函数需要返回0
注意: 只使用ANSI C/ANSI C++ 标准,不要调用依赖于编译环境或操作系统的特殊函数。
注意: 所有依赖的函数必须明确地在源文件中 #include <xxx>, 不能通过工程设置而省略常用头文件。

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

  

14

主题

65

回帖

0

积分

新手上路

积分
0
 楼主| 发表于 2013-6-30 20:07:23 | 显示全部楼层
暂时也没想到好的算法,递归的效率实在太低了。。。

#include <string.h>
#include <stdio.h>

#define MAX_SIZE 9
#define MAX_INT 0x7FFFFFFF

#define MIN(x, y) ((x) < (y) ? (x) : (y))

int g_array[MAX_SIZE][MAX_SIZE] = {0};
int g_visit[MAX_SIZE][MAX_SIZE] = {0};
int g_row = 0;
int g_col = 0;
int g_minNum = MAX_INT;
int g_half = 0;
int g_direction[4][2] = {{-1,&#160;&#160;0},
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; { 0,&#160;&#160;1},
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; { 1,&#160;&#160;0},
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; { 0, -1}};

int checkValid(int rIdx, int cIdx)
{
&#160;&#160;&#160;&#160;if (0 > rIdx || rIdx >= g_row
&#160;&#160;&#160;&#160; || 0 > cIdx || cIdx >= g_col)
&#160;&#160;&#160;&#160;{
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;return 0;
&#160;&#160;&#160;&#160;}

&#160;&#160;&#160;&#160;return 1;
}

void dfs(int rIdx, int cIdx, int sum, int num)
{
&#160;&#160;&#160;&#160;int i;

&#160;&#160;&#160;&#160;sum += g_array[rIdx][cIdx];

&#160;&#160;&#160;&#160;if (sum > g_half || num + 1 > g_minNum)
&#160;&#160;&#160;&#160;{
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;return;
&#160;&#160;&#160;&#160;}

&#160;&#160;&#160;&#160;if (sum == g_half && 0 != g_visit[0][0])
&#160;&#160;&#160;&#160;{
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;g_minNum = MIN(g_minNum, num + 1);
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;return;
&#160;&#160;&#160;&#160;}

&#160;&#160;&#160;&#160;for (i = 0; i < 4; i++)
&#160;&#160;&#160;&#160;{
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;int nrIdx = rIdx + g_direction[0];
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;int ncIdx = cIdx + g_direction[1];

&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;if (checkValid(nrIdx, ncIdx)
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; && 0 == g_visit[nrIdx][ncIdx]
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; && sum + g_array[nrIdx][ncIdx] <= g_half)
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;{
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;g_visit[rIdx][cIdx] = 1;
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;dfs(nrIdx, ncIdx, sum, num + 1);
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;g_visit[rIdx][cIdx] = 0;
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;}
&#160;&#160;&#160;&#160;}
}

int main()
{
&#160;&#160;&#160;&#160;int i, j;

&#160;&#160;&#160;&#160;// 输入数字矩阵
&#160;&#160;&#160;&#160;scanf("%d %d", &g_col, &g_row);
&#160;&#160;&#160;&#160;for (i = 0; i < g_row; i++)
&#160;&#160;&#160;&#160;{
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;for (j = 0; j < g_col; j++)
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;{
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;scanf("%d", &g_array[j]);
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;g_half += g_array[j];
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;}
&#160;&#160;&#160;&#160;}

&#160;&#160;&#160;&#160;// 初步校验解是否存在
&#160;&#160;&#160;&#160;if ((0 != (g_half & 1)) || (2 * g_array[0][0] > g_half))
&#160;&#160;&#160;&#160;{
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;printf("0\n");
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;return 0;
&#160;&#160;&#160;&#160;}

&#160;&#160;&#160;&#160;g_half /= 2;

&#160;&#160;&#160;&#160;for (i = 0; i < g_row; i++)
&#160;&#160;&#160;&#160;{
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;for (j = 0; j < g_col; j++)
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;{
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;memset(g_visit, 0, sizeof(g_visit));

&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;dfs(i, j, 0, 0);
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;}
&#160;&#160;&#160;&#160;}

&#160;&#160;&#160;&#160;printf("%d\n", MAX_INT == g_minNum ? 0 : g_minNum);

&#160;&#160;&#160;&#160;return 0;
}

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

果子博客
扫码关注微信公众号

Archiver|手机版|小黑屋|风叶林

GMT+8, 2026-2-1 12:27 , Processed in 0.080613 second(s), 21 queries .

Powered by 风叶林

© 2001-2026 Discuz! Team.

快速回复 返回顶部 返回列表