藍橋杯 PREV 4 剪格仔 DFS

2021-08-17 13:52:32 字數 1064 閱讀 3143

題目鏈結

給定乙個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...