題目描述 如【圖 1.jpg】, 有 12 張連在一起的 12 生肖的郵票。 現在你要從中剪下 5 張來,要求必須 是連著的。 (僅僅連線乙個角不算相連) 比如,【圖 2.jpg】,【圖 3.jpg】中,粉紅色所 示部分就是合格的剪取。
請你計算,一共有多少種不同的剪取方法。 請填寫表示方案數目的整數。 注意:你提交的應該是乙個整數,不要填寫任何多餘的內容 或說明性文字。
先給大家說下這個題目拿過來我的思路吧
首先題目的意思是有12個框框,我們要選擇5個框框,再來判斷是否連通,若聯通,則答案加1
python的話從12個框框中選5個很簡單,即呼叫itertools.combinations函式(記住是組合而不是排列)
但是要判斷是否聯通,對於兩個框框肯定是相鄰的,題目上標註的數字的話則是兩個框框之差絕對值為1或者4!可是有個問題,就是絕對值為1的不一定相鄰,比如 8 9
因此我們可以把以上的圖變(想成)為下面的
說明:改數字對結果毫無影響,只是讓我們更好判斷是否連通
顯然我們看到 只要兩個框框之差絕對值為 1或者5 就一定相鄰
在12個框框中選擇5個後,我們用bfs演算法判斷這個5個框框是否連通。
**如下
import itertools
defisliant
(x):
##相當於bfs,找出每個框框的所有相鄰框框後判斷
q=0]
) seen=
set(
) seen.add(x[0]
)while
len(q)
>0:
n=q.pop(0)
if n-
1in x and n-
1not
in seen:1)
seen.add(n-1)
if n+
1in x and n+
1not
in seen:1)
seen.add(n+1)
if n-
5in x and n-
5not
in seen:5)
seen.add(n-5)
if n+
5in x and n+
5not
in seen:5)
seen.add(n+5)
ifset
(seen)
==set
(x):
##所有看到過的seen陣列裡的均聯通,若有乙個框框與其他的不連通,則seen長度絕對小於原有的x長度
return
true
else
:return
false
count=0a=
[1,2
,3,4
,6,7
,8,9
,11,12
,13,14
]b=list
(itertools.combinations(a,5)
)for i in b:
if isliant(i)
: count+=
1print
(count)
2016藍橋 剪郵票
講述來自 感謝作者 剪郵票如 圖1.jpg 有12張連在一起的12生肖的郵票。現在你要從中剪下5張來,要求必須是連著的。僅僅連線乙個角不算相連 比如,圖2.jpg 圖3.jpg 中,粉紅色所示部分就是合格的剪取。請你計算,一共有多少種不同的剪取方法。思路 先找到5個數的組合,然後從第乙個數字開始遍歷...
2016 藍橋杯 剪郵票 dfs
這是2016年藍橋杯c語言省賽b組的第七題 題目 如下圖,有12張連在一起的12生肖的郵票。現在你要從中剪下5張來,要求必須是連著的。僅僅連線乙個角不算相連 比如,下面兩張圖中,粉紅色所示部分就是合格的剪取。請你計算,一共有多少種不同的剪取方法。輸出 請填寫表示方案數目的整數。oj鏈結 思路 通過對...
藍橋杯2016初賽 剪郵票
題目描述 如下圖,有12張連在一起的12生肖的郵票。現在你要從中剪下5張來,要求必須是連著的。僅僅連線乙個角不算相連 比如,下面兩張圖中,粉紅色所示部分就是合格的剪取。請你計算,一共有多少種不同的剪取方法。輸出請填寫表示方案數目的整數。思想 一看資料量應該就知道是乙個簡單的 dfs 或者 bfs 的...