題目鏈結給定乙個
n*m
的格仔,每個格仔上都有相對應的數字,讓你將其分割成兩部分,兩部分格仔的數字之和相等。
如果存在多種解答,請輸出包含左上角格仔的那個區域包含的格仔的最小數目。
如果無法分割,則輸出 0。
首先我們需要找到題目中的突破口,那就是左上角的格仔,題目要求,其中一部分要求必須包含左上角的格仔,那麼我們就可以從左上角開始搜尋。
問題來了,用深搜還是廣搜,要求格仔最少第一想到的應是廣搜,但可以在心中模擬一下,廣搜可以嗎?會發現搜的過程中肯定有很多種方案是搜不到的,這是侯就應該想深搜。
深搜方法:從(0,0)開始搜尋,邊搜尋邊標記,在搜尋的過程中,判斷已經搜尋的路徑之和是否為總和(所有格仔的和)的一半,如果是,則將當前路徑中格仔的數量比較ans選出較小的情況附給ans,搜尋完一條路徑之後需要釋放標記,以免影響其他遞迴的過程。
比較所有情況之後輸出最小的ans即可。
注意:這道題中的m,n會對換,看清題目! 當時在寫的時候發現第二組資料怎麼都輸不出來,原來就是題目將行和列對調了
#include
#include
using
namespace
std;
int mat[11][11];
int vis[11][11];
int dir[4][2] = ;
int m, n, ans, all;
bool judge(int x, int y)
//x,y 為座標, t1 為格仔數量, t2為格仔之和 ,all為所有格仔之和
void dfs(int x, int y, int t1, int t2)
for(int i = 0; i < 4; ++ i)
}}int main()
} vis[0][0] = 1;
dfs(0, 0, 1, mat[0][0]);
printf("%d\n", ans);
return
0;}
藍橋杯 PREV 4 剪格仔 搜尋
資源限制 時間限制 1.0s 記憶體限制 256.0mb 問題描述 如下圖所示,3 x 3 的格仔中填寫了一些整數。10 1 52 20 30 1 1 2 3 我們沿著圖中的星號線剪開,得到兩個部分,每個部分的數字和都是60。本題的要求就是請你程式設計判定 對給定的m x n 的格仔中的整數,是否可...
(藍橋杯)歷屆試題PREV 4 剪格仔 C
問題描述 如下圖所示,3 x 3 的格仔中填寫了一些整數。10 1 52 20 30 1 1 2 3 我們沿著圖中的星號線剪開,得到兩個部分,每個部分的數字和都是60。本題的要求就是請你程式設計判定 對給定的m x n 的格仔中的整數,是否可以分割為兩個部分,使得這兩個區域的數字和相等。如果存在多種...
藍橋杯 剪格仔(dfs)
由題意可得從左上角的數開始dfs,途徑的數的和等於總和的一半時退出,注意走的時候可以斜著走,當總和為奇數時無法分割,當第乙個數即為總和一半時直接輸出1。include include include using namespace std const int m 15 int m,n,sum 0 i...