第四届蓝桥杯C++A组 剪格子
2018-03-28 15:04
148 查看
标题:剪格子如图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
请严格按要求输出,不要画蛇添足地打印类似:“请您输入...” 的多余内容。所有代码放在同一个源文件中,调试通过后,拷贝提交该源码。注意: main函数需要返回0
注意: 只使用ANSI C/ANSI C++ 标准,不要调用依赖于编译环境或操作系统的特殊函数。
注意: 所有依赖的函数必须明确地在源文件中 #include <xxx>, 不能通过工程设置而省略常用头文件。提交时,注意选择所期望的编译器类型。
思路:我用的dfs,从左上角出发,可以往上下左右四个方向走,然后累加到和为sum/2时返回,每次找到一条路线就比较一下步数,记录下最小的步数。但是实际上这种做法是有问题的,因为dfs相当于一笔画成,所以T型十字型这种都是dfs搜索不到的,还有这种dfs也做不到最后一定是两块连通的区域,下面给出不能解决的情况的示意图,然而菜鸡的我并不知道怎么解决……不过蓝桥的后台测试数据很水,我这个写法的代码也是可以全通过的。
代码:
我们沿着图中的红色线剪开,得到两个部分,每个部分的数字和都是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
请严格按要求输出,不要画蛇添足地打印类似:“请您输入...” 的多余内容。所有代码放在同一个源文件中,调试通过后,拷贝提交该源码。注意: main函数需要返回0
注意: 只使用ANSI C/ANSI C++ 标准,不要调用依赖于编译环境或操作系统的特殊函数。
注意: 所有依赖的函数必须明确地在源文件中 #include <xxx>, 不能通过工程设置而省略常用头文件。提交时,注意选择所期望的编译器类型。
思路:我用的dfs,从左上角出发,可以往上下左右四个方向走,然后累加到和为sum/2时返回,每次找到一条路线就比较一下步数,记录下最小的步数。但是实际上这种做法是有问题的,因为dfs相当于一笔画成,所以T型十字型这种都是dfs搜索不到的,还有这种dfs也做不到最后一定是两块连通的区域,下面给出不能解决的情况的示意图,然而菜鸡的我并不知道怎么解决……不过蓝桥的后台测试数据很水,我这个写法的代码也是可以全通过的。
代码:
#include<cstdio> #include<cstdlib> #include<cstring> #include<cmath> #include<iostream> #include<algorithm> #include<string> #include<vector> #include<queue> #include<set> using namespace std; int m, n, sum, mins; int map[10][10], vis[10][10]; int dir[4][2] = { -1,0,1,0,0,-1,0,1 }; void dfs(int x, int y, int v, int step) { if (v == sum && step < mins) { mins = step; return; } for (int i = 0; i < 4; i++) { int dx = x + dir[i][0]; int dy = y + dir[i][1]; if (!vis[dx][dy] && dx >= 0 && dx < n&&dy >= 0 && dy < m&&v + map[dx][dy] <= sum) { vis[dx][dy] = 1; dfs(dx, dy, v + map[dx][dy], step + 1); vis[dx][dy] = 0; } } } int main() { cin >> m >> n; sum = 0; mins = 0x3f3f3f3f; for (int i = 0; i < n; i++) { for (int j = 0; j < m; j++) { cin >> map[i][j]; sum += map[i][j]; } } sum /= 2; vis[0][0] = 1; dfs(0, 0, map[0][0], 1); if (mins < 0x3f3f3f3f) cout << mins << endl; else cout << "0" << endl; return 0; }
相关文章推荐
- 第四届蓝桥杯C++A组 排它平方数
- 4000 【第四届蓝桥杯】剪格子
- 剪格子——第四届蓝桥杯省赛C语言A组第9题
- 第四届蓝桥杯C++A组 逆波兰表达式
- 第四届蓝桥杯C++A组 大臣的旅费
- 第四届蓝桥杯--剪格子
- 第四届蓝桥杯C++A组 振兴中华
- 第四届蓝桥杯C++A组 颠倒的价牌
- 第四届蓝桥杯第二题马虎的算式
- 第四届蓝桥杯JAVAB组省赛真题——马虎的算式
- [蓝桥杯] 历届试题 剪格子(dfs+回溯)
- 蓝桥杯java第四届决赛第一题--猜灯谜
- 蓝桥杯 操作格子 (线段树)
- 蓝桥杯历届试题 剪格子
- 蓝桥杯_法训练—操作格子(线段树点更新与区间查询)
- 蓝桥杯第四届 第39级台阶
- 【第四届蓝桥杯】马虎的算式
- 第四届 蓝桥杯C/C++ B组 第1题高斯日记
- 错误票据-第四届蓝桥杯java B组
- 第四届 蓝桥杯C/C++ 高职 7、核桃的数量