DFS 藍橋杯試題 剪郵票

2021-10-03 04:18:34 字數 2001 閱讀 3733

填空題

如【圖1.jpg】, 有12張連在一起的12生肖的郵票。

現在你要從中剪下5張來,要求必須是連著的。

(僅僅連線乙個角不算相連)

比如,【圖2.jpg】,【圖3.jpg】中,粉紅色所示部分就是合格的剪取。

請你計算,一共有多少種不同的剪取方法。

請填寫表示方案數目的整數。

注意:你提交的應該是乙個整數,不要填寫任何多餘的內容或說明性文字。

如果用dfs直接搜的話,答案肯定是錯的,因為dfs每次會沿著上下左右中的乙個方向進行搜尋,所以肯定走不出類似「t」或者「+」 這種形狀,因為比如「+」,中心點的兩個方向甚至四個方向都要走,這是dfs無法做到的。所以決定先在1到12中選出5個數,然後判斷這5個數所在的格仔是否能夠連通即可,聯通的話可以用dfs判斷。

#include

using

namespace std;

set<

int> con[13]

;int p[5]

;bool dfs_vis[5]

;bool vis[15]

;int ans;

bool ans_vis[15]

[15][

15][15

][15]

;/**

* 用dfs判斷下標為i的那個數所在的格仔能否到達下標為j的那個數所在的格仔

* @param x 下標x

* @param y 下標y

*/bool

dfs_check

(int x,

int y)

// 通過其他三個鄰居判斷

for(

int i =

0;i <

5; i++)if

(con[p[x]].

count

(p[i]))

}}}return

false;}

/** * 檢查找到的5個數所在的格仔是否連通,連通的話判斷是否出現過

* @return 是否合格(連通並且沒出現過)

*/bool

check()

// 判斷 i到j能不能走通

memset

(dfs_vis,

false

,sizeof

(dfs_vis));

if(!dfs_check

(i,j))}

}// 判斷是否出現過

int tmp[5]

;memcpy

(tmp,p,

sizeof

(p))

;sort

(tmp,tmp+5)

;if(ans_vis[tmp[0]

][tmp[1]

][tmp[2]

][tmp[3]

][tmp[4]

])ans_vis[tmp[0]

][tmp[1]

][tmp[2]

][tmp[3]

][tmp[4]

]=true

;return

true;}

/** * 在1 到 12中找出5個數

* @param x 正在找第幾個數

*/void

dfs(

int x)

return;}

for(

int i =

1; i <=

12; i++)}

}int

main()

116

2016 藍橋杯 剪郵票 dfs

這是2016年藍橋杯c語言省賽b組的第七題 題目 如下圖,有12張連在一起的12生肖的郵票。現在你要從中剪下5張來,要求必須是連著的。僅僅連線乙個角不算相連 比如,下面兩張圖中,粉紅色所示部分就是合格的剪取。請你計算,一共有多少種不同的剪取方法。輸出 請填寫表示方案數目的整數。oj鏈結 思路 通過對...

藍橋杯2016初賽 剪郵票 DFS

如下圖,有12張連在一起的12生肖的郵票。現在你要從中剪下5張來,要求必須是連著的。僅僅連線乙個角不算相連 求多少種剪法。間接相當於求路徑 條數 方法數等,所以我們可以很容易的想到利用 dfs 來做。但是我沒有考慮到的是,該題的圖三 下圖 這種走法 t型呀 型呀等 dfs是走不到的,dfs最直觀的就...

藍橋杯 剪郵票 全排列 DFS

剪郵票 如 圖1.jpg 有12張連在一起的12生肖的郵票。現在你要從中剪下5張來,要求必須是連著的。僅僅連線乙個角不算相連 比如,圖2.jpg 圖3.jpg 中,粉紅色所示部分就是合格的剪取。請你計算,一共有多少種不同的剪取方法。請填寫表示方案數目的整數。注意 你提交的應該是乙個整數,不要填寫任何...