洛谷P8601[蓝桥杯][2013年第四届真题]剪格子
创始人
2024-05-26 06:45:12

题目描述

如图 11 所示,3×3 的格子中填写了一些整数。

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

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

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

如果无法分割,则输出 00。

输入格式

程序先读入两个整数 mm,nn 用空格分割 (m,n<10)(m,n<10) 表示表格的宽度和高度。

接下来是 nn 行,每行 mm 个正整数,用空格分开。每个整数不大于 1000010000。

输出格式

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

输入输出样例

输入

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

说明/提示

第二个用例中:

时限 5 秒, 64M。蓝桥杯 2013 年第四届省赛

思路:利用搜索遍历每一种解决方案,把每种解决方案中格子的个数记录下来,然后输出最少格子数

#include
using namespace std;
int g[11][11];
int vis[11][11];
int n, m, num[10010], sum, s, k;
int xx[] = { 1,0,-1,0 };
int yy[] = { 0,1,0,-1 };
void dfs(int x, int y)
{if (s == sum / 2){for (int i = 1; i <= n; i++){for (int j = 1; j <= m; j++){if (vis[i][j] == 1) num[k]++;}}k++;return;}for (int i = 0; i < 4; i++){int dx = x + xx[i];int dy = y + yy[i];if (dx>=1 && dx<=n && dy>=1 && dy<=m && vis[dx][dy]==0 ){vis[dx][dy] = 1;s += g[dx][dy];dfs(dx, dy);s -= g[dx][dy]; //回溯vis[dx][dy] = 0;}}
}
int main()
{cin >> m >> n;int i, j;for (i = 1; i <= n; i++){for (j = 1; j <= m; j++){cin >> g[i][j];sum += g[i][j];}}vis[1][1] = 1;s += g[1][1];dfs(1, 1);int minn = num[0];for (i = 0; i < k; i++){minn = min(minn, num[i]);}cout << minn << endl;return 0;
}

这串代码在洛谷中只能跑过3个测试案例,暂时还没有找到更好的解决方法,呜呜~~

相关内容

热门资讯

demo什么意思 demo版本... 618快到了,各位的小金库大概也在准备开闸放水了吧。没有小金库的,也该向老婆撒娇卖萌服个软了,一切只...
苗族的传统节日 贵州苗族节日有... 【岜沙苗族芦笙节】岜沙,苗语叫“分送”,距从江县城7.5公里,是世界上最崇拜树木并以树为神的枪手部落...
北京的名胜古迹 北京最著名的景... 北京从元代开始,逐渐走上帝国首都的道路,先是成为大辽朝五大首都之一的南京城,随着金灭辽,金代从海陵王...
长白山自助游攻略 吉林长白山游... 昨天介绍了西坡的景点详细请看链接:一个人的旅行,据说能看到长白山天池全凭运气,您的运气如何?今日介绍...
世界上最漂亮的人 世界上最漂亮... 此前在某网上,选出了全球265万颜值姣好的女性。从这些数量庞大的女性群体中,人们投票选出了心目中最美...