1. 程式人生 > >隨手練——減郵票(16藍橋杯省賽C/C++B組 第七題)

隨手練——減郵票(16藍橋杯省賽C/C++B組 第七題)

技術分享 要求 核心 合格 ima 循環 連通圖 是個 using

剪郵票

技術分享圖片, 有12張連在一起的12生肖的郵票。
現在你要從中剪下5張來,要求必須是連著的。
(僅僅連接一個角不算相連)
比如,技術分享圖片技術分享圖片中,粉紅色所示部分就是合格的剪取。

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

這5個點一定是個連通圖,那麽DFS,BFS都是可以一次遍歷所有節點的,動手試了一下,BFS更好寫。

核心思想:1. BFS判定給定的5個位置是否符合。

     2. 每層循環取不同值,避免重復

#include <iostream>
#include <queue>
using namespace std;

bool BFS(int a, int b, int c, int
d, int e) { bool m[13] = {0}; queue<int>q; m[b] = 1; m[c] = 1; m[d] = 1; m[e] = 1; q.push(a); while (!q.empty()) { int i = q.front(); q.pop(); //向上走 if ((i - 4) > 0 && m[i - 4] == 1) { m[i - 4] = 0; q.push(i - 4); }
//向下走 if ((i + 4) < 13 && m[i + 4] == 1) { m[i + 4] = 0; q.push(i + 4); } //向右走 if (i != 4 && i != 8 && i + 1 < 13 && m[i + 1] == 1) { m[i + 1] = 0; q.push(i + 1); }
//向左走 if (i != 5 && i != 9 && i - 1 > 0 && m[i - 1] == 1) { m[i - 1] = 0; q.push(i - 1); } } for (int i = 1; i < 13; i++) if (m[i])return false; return true; } int main() { int a, b, c, d, e, res = 0; for (a = 1; a <= 8; a++) { for (b = a + 1; b <= 9; b++) { for (c = b + 1; c <= 10; c++) { for (d = c + 1; d <= 11; d++) { for (e = d + 1; e <= 12; e++) { if (BFS(a, b, c, d, e)) { printf("%d %d %d %d %d\n", a, b, c, d, e); res++; } } } } } } cout << res << endl; return 0; }

隨手練——減郵票(16藍橋杯省賽C/C++B組 第七題)