2017/National _C_C++_B/2/磁砖样式
生活随笔
收集整理的這篇文章主要介紹了
2017/National _C_C++_B/2/磁砖样式
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
標題:磁磚樣式
小明家的一面裝飾墻原來是 3*10 的小方格。
現在手頭有一批剛好能蓋住2個小方格的長方形瓷磚。
瓷磚只有兩種顏色:黃色和橙色。
小明想知道,對于這么簡陋的原料,可以貼出多少種不同的花樣來。
小明有個小小的強迫癥:忍受不了任何2*2的小格子是同一種顏色。
(瓷磚不能切割,不能重疊,也不能只鋪一部分。另外,只考慮組合圖案,請忽略瓷磚的拼縫)
顯然,對于 2*3 個小格子來說,口算都可以知道:一共10種貼法,如【p1.png所示】
但對于 3*10 的格子呢?肯定是個不小的數目,請你利用計算機的威力算出該數字。
注意:你需要提交的是一個整數,不要填寫任何多余的內容(比如:說明性文字)
Ideas
統計總數,一看就想到用DFS。
1、首先,確定一個檢查函數,判斷瓷磚鋪設是否符合要求;
2、3*10的地板,每一列上肯定是一個豎著的,一個橫著的,或者三塊橫著的;
3.深搜算法,先判斷當前位置是否已經存在瓷磚,然后判斷在邊界內當前位置的下方和左方是否已經存在瓷磚:
3.1、如果左邊沒有瓷磚,直接鋪一塊橫著的瓷磚然后繼續深搜4.用0表示還未鋪設瓷磚,1表示黃色瓷磚,2表示橙色瓷磚;
Code
C++
#include <iostream> #include <cstring> #include <map>using namespace std;map<int, int> Hash; int ans = 0, graph[3][10];bool check() {for (int i = 0; i < 2; i++)for (int j = 0; j < 9; j++)if ((graph[i][j] + graph[i][j + 1] + graph[i + 1][j] + graph[i + 1][j + 1]) % 4 == 0)return false;return true; }void dfs(int x, int y) {if (graph[x][y] == -1) {//橫向鋪設if (y < 9 && graph[x][y + 1] == -1) {for (int i = 0; i < 2; i++) {graph[x][y] = graph[x][y + 1] = i;dfs(x, y + 1);graph[x][y] = graph[x][y + 1] = -1;}}//縱向鋪設if (x < 2 && graph[x + 1][y] == -1) {for (int i = 0; i < 2; i++) {graph[x][y] = graph[x + 1][y] = i;if (y == 9) dfs(x + 1, 0);else dfs(x, y + 1);graph[x][y] = graph[x + 1][y] = -1;}}} else {if (x == 2 && y == 9) {if (check()) {int ret = 0;for (int i = 0; i < 3; i++)for (int j = 0; j < 10; j++)ret = ret * 2 + graph[i][j];Hash[ret]++;if (Hash[ret] == 1)ans++;}return;}if (y == 9) dfs(x + 1, 0);else dfs(x, y + 1);} }int main() {memset(graph, -1, sizeof(graph));dfs(0, 0);cout << ans << endl;return 0; }總結
以上是生活随笔為你收集整理的2017/National _C_C++_B/2/磁砖样式的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Lake Counting POJ -
- 下一篇: 2017年第八届蓝桥杯C/C++ A组国