填空題
如【圖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 中,粉紅色所示部分就是合格的剪取。請你計算,一共有多少種不同的剪取方法。請填寫表示方案數目的整數。注意 你提交的應該是乙個整數,不要填寫任何...