征战蓝桥 —— 2013年第四届 —— C/C++A组第9题——剪格子
剪格子
如圖p1.jpg所示,3 x 3 的格子中填寫了一些整數(shù)。
我們沿著圖中的紅色線剪開,得到兩個(gè)部分,每個(gè)部分的數(shù)字和都是60。
本題的要求就是請(qǐng)你編程判定:對(duì)給定的m x n 的格子中的整數(shù),是否可以分割為兩個(gè)部分,使得這兩個(gè)區(qū)域的數(shù)字和相等。
如果存在多種解答,請(qǐng)輸出包含左上角格子的那個(gè)區(qū)域包含的格子的最小數(shù)目。
如果無(wú)法分割,則輸出 0
程序輸入輸出格式要求:
程序先讀入兩個(gè)整數(shù) m n 用空格分割 (m,n<10)
表示表格的寬度和高度
接下來(lái)是n行,每行m個(gè)正整數(shù),用空格分開。每個(gè)整數(shù)不大于10000
程序輸出:在所有解中,包含左上角的分割區(qū)可能包含的最小的格子數(shù)目。
例如:
用戶輸入:
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)
資源約定:
峰值內(nèi)存消耗 < 64M
CPU消耗 < 5000ms
請(qǐng)嚴(yán)格按要求輸出,不要畫蛇添足地打印類似:“請(qǐng)您輸入…” 的多余內(nèi)容。
所有代碼放在同一個(gè)源文件中,調(diào)試通過(guò)后,拷貝提交該源碼。
注意: main函數(shù)需要返回0
注意: 只使用ANSI C/ANSI C++ 標(biāo)準(zhǔn),不要調(diào)用依賴于編譯環(huán)境或操作系統(tǒng)的特殊函數(shù)。
注意: 所有依賴的函數(shù)必須明確地在源文件中 #include , 不能通過(guò)工程設(shè)置而省略常用頭文件。
提交時(shí),注意選擇所期望的編譯器類型。
代碼
#include <iostream> #include <algorithm>using namespace std;int m, n; int total; int g[10][10]; int vis[10][10]; int ans = 100;void f(int i, int j, int sum, int cnt) {if (sum > total / 2) return;if (sum == total / 2) {ans = min(ans, cnt);return;}vis[i][j]=1; // 可以有四個(gè)分支往下走if (i + 1 <= n-1&&vis[i+1][j]==0)f(i + 1, j, sum + g[i][j], cnt + 1);if (i - 1 >= 0&&vis[i-1][j]==0)f(i - 1, j, sum + g[i][j], cnt + 1);if (j + 1 <= m-1&&vis[i][j+1]==0)f(i, j + 1, sum + g[i][j], cnt + 1);if (j - 1 >= 0&&vis[i][j-1]==0)f(i, j - 1, sum + g[i][j], cnt + 1);vis[i][j]=0; }int main(int argc, const char *argv[]) {scanf("%d %d", &m, &n);for (int i = 0; i < n; ++i) {for (int j = 0; j < m; ++j) {scanf("%d", &g[i][j]);total += g[i][j];}}f(0, 0, 0, 0);if(ans!=100)printf("%d\n",ans);elseprintf("%d\n",0);return 0; } 與50位技術(shù)專家面對(duì)面20年技術(shù)見證,附贈(zèng)技術(shù)全景圖總結(jié)
以上是生活随笔為你收集整理的征战蓝桥 —— 2013年第四届 —— C/C++A组第9题——剪格子的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 征战蓝桥 —— 2013年第四届 ——
- 下一篇: 信息学奥赛一本通(C++)在线评测系统—