1. 程式人生 > >2017第八屆藍橋杯決賽(B組)2.磁磚樣式

2017第八屆藍橋杯決賽(B組)2.磁磚樣式

利用 分享 部分 span 裝飾 mage 整數 bool png

磁磚樣式

小明家的一面裝飾墻原來是 310 的小方格。
現在手頭有一批剛好能蓋住2個小方格的長方形瓷磚。
瓷磚只有兩種顏色:黃色和橙色。
小明想知道,對於這麽簡陋的原料,可以貼出多少種不同的花樣來。
小明有個小小的強迫癥:忍受不了任何2
2的小格子是同一種顏色。
(瓷磚不能切割,不能重疊,也不能只鋪一部分。另外,只考慮組合圖案,請忽略瓷磚的拼縫)
顯然,對於 23 個小格子來說,口算都可以知道:一共10種貼法,如【p1.png所示】
但對於 3
10 的格子呢?肯定是個不小的數目,請你利用計算機的威力算出該數字。
註意:你需要提交的是一個整數,不要填寫任何多余的內容(比如:說明性文字)
技術分享圖片

解題思路

暴力枚舉解答樹,然後判斷該解是否可行

源碼

#include <iostream>
int cnt = 0;

#define COLOR_ORANGE 1
#define COLOR_YELLOW 2

int cell[3][10]{ 0 };

bool isOK() {
    for (int x = 1; x < 3; x++) {
        for (int y = 1; y < 10; y++) {
            if (cell[x - 1][y - 1] == cell[x][y]&& cell[x][y] == cell[x - 1][y]&& cell[x][y] == cell[x][y - 1
]) { return false; } } } return true; } void fill(int x, int y) { if (x == 3) { if (isOK()) { cnt++; /*std::cout << "-------------------\n"; for (int i = 0; i < 3; i++) { for (int k = 0; k < 10; k++) {
std::cout << cell[i][k] << " "; } std::cout << "\n"; }*/ } return; } for (int p = 1; p <= 2; p++) { if (y + 1 < 10 && cell[x][y] == 0 && cell[x][y + 1] == 0) { cell[x][y] = p; cell[x][y + 1] = p; if (y == 8) { fill(x + 1, 0); } else { fill(x, y + 2); } cell[x][y] = 0; cell[x][y + 1] = 0; } if (x + 1 <= 3 && cell[x][y] == 0 && cell[x + 1][y] == 0) { cell[x][y] = p; cell[x + 1][y] = p; if (y == 9) { fill(x + 1, 0); } else { fill(x, y + 1); } cell[x][y] = 0; cell[x + 1][y] = 0; } } } int main(){ fill(0, 0); std::cout << cnt; return 0; }

2017第八屆藍橋杯決賽(B組)2.磁磚樣式