如圖p1.jpg所示,3 x 3 的格仔中填寫了一些整數。
我們沿著圖中的紅色線剪開,得到兩個部分,每個部分的數字和都是60。
本題的要求就是請你程式設計判定:對給定的m x n 的格仔中的整數,是否可以分割為兩個部分,使得這兩個區域的數字和相等。
如果存在多種解答,請輸出包含左上角格仔的那個區域包含的格仔的最小數目。
如果無法分割,則輸出 0
程式輸入輸出格式要求:
程式先讀入兩個整數 m n 用空格分割 (m,n<10)
表示**的寬度和高度
接下來是n行,每行m個正整數,用空格分開。每個整數不大於10000
程式輸出:在所有解中,包含左上角的分割區可能包含的最小的格仔數目。
例如:使用者輸入:
3 310 1 52
20 30 1
1 2 3
則程式輸出:
3再例如:
使用者輸入:
4 31 1 1 1
1 30 80 2
1 1 1 100
則程式輸出:
10(參見p2.jpg)
資源約定:
峰值記憶體消耗 < 64m
cpu消耗 < 5000ms
#include
#include
#include
#include
#define mk(i,j) make_pair(i,j)
using
namespace std;
int m, n;
int total;
int g[10]
[10];
int ans;
/*抽象了一種剪輯方法*/
class
cut;
/** * 將st中的元素拷貝到新set中
* @param st
* @return
*/set
int,
int>
>
copyset
(set
int,
int>
>
&st)
return ans;
}void
add(
int sum,
int i,
int j, set
int,
int>
>
&grids, cut *
&cut_new)
vector
> vs[
100]
;//分別儲存格仔數為1~100的各種剪法
intmain
(int argc,
const
char
*ar**)
}// 第乙個格仔就是一半
if(g[0]
[0]== total /2)
/*左上角格仔,只有一種剪法,加入v[1]*/
cut *c =
newcut()
;const pair<
int,
int> p =
make_pair(0
,0);
c->grids.
insert
(p);
c->sum = g[0]
[0];
vs[1]
.push_back
(c);
//只包含乙個格仔且包含00的只有一種剪法
for(
int i =
2; i <= m * n;
++i)
else
if(cut_new-
>sum
vs[i]
.push_back
(cut_new);}
if(x-
1>=
0&&grids.
find(mk
(x-1
,y))
==grids.
end())
else
if(cut_new-
>sum
vs[i]
.push_back
(cut_new);}
if(y+
1find(mk
(x,y+1)
)==grids.
end())
else
if(cut_new-
>sum
vs[i]
.push_back
(cut_new);}
if(y-
1>=
0&&grids.
find(mk
(x,y-1)
)==grids.
end())
else
if(cut_new-
>sum
vs[i]
.push_back
(cut_new);}
iter++;}
}}printf
("%d\n",0
);return0;
}
剪格仔 藍橋杯
問題描述 如下圖所示,3 x 3 的格仔中填寫了一些整數。10 1 52 20 30 1 1 2 3 我們沿著圖中的星號線剪開,得到兩個部分,每個部分的數字和都是60。本題的要求就是請你程式設計判定 對給定的m x n 的格仔中的整數,是否可以分割為兩個部分,使得這兩個區域的數字和相等。如果存在多種...
剪格仔 藍橋杯
這是2013 年第四屆藍橋杯全國軟體大賽預賽a組 c c 組 第9 題,為程式設計題,方法是深度優先搜尋 dfs 如圖p1.jpg 所示,3 x 3 的格仔中填寫了一些整數。我們沿著圖中的紅色線剪開,得到兩個部分,每個部分的數字和都是60。本題的要求就是請你程式設計判定 對給定的 m x n 的格仔...
藍橋杯 剪格仔
問題描述 如下圖所示,3 x 3 的格仔中填寫了一些整數。10 1 52 20 30 1 1 2 3 我們沿著圖中的星號線剪開,得到兩個部分,每個部分的數字和都是60。本題的要求就是請你程式設計判定 對給定的m x n 的格仔中的整數,是否可以分割為兩個部分,使得這兩個區域的數字和相等。如果存在多種...