有2种不同颜色规格为1*2的瓷砖,用其来铺设地板,不能重叠和越界。并且,地板中任意2*2的格子不能为同一种颜色。如图,当地板为2*3时,有10种铺设方案。问:当地板为3*10时,问有多少种铺设方案?
dfs深搜
#include<iostream> #include<cstring> #include<cstdio> #include<cmath> #include<algorithm> using namespace std; #define maxn 3 #define maxm 10 int a[maxn][maxm]; int ans; bool check() { for(int i = 0; i < maxn-1; i++) for(int j = 0; j < maxm-1; j++) { int p = a[i][j]; if(p == -1) return false; //地板必须全部铺满 if(p == a[i+1][j] && p == a[i][j+1] && p == a[i+1][j+1]) return false; //任意2*2格子不能为同一种颜色 } return true; } void dfs(int cur) { if(cur == maxn * maxm) { if(check()) { ans++; } return; } //计算出 int x = (cur - 1) / maxm; int y = cur - x * maxm - 1; if(a[x][y] != -1)dfs(cur + 1);//格子已经铺了 //横着铺 if(y + 1 < maxm && a[x][y] == -1 && a[x][y + 1] == -1) { a[x][y] = a[x][y + 1] = 0; dfs(cur + 1); a[x][y] = a[x][y + 1] = 1; dfs(cur + 1); a[x][y] = a[x][y + 1] = -1; } //竖着铺 if(x + 1 < maxn && a[x][y] == -1 && a[x + 1][y] == -1) { a[x][y] = a[x + 1][y] = 0; dfs(cur + 1); a[x][y] = a[x + 1][y] = 1; dfs(cur + 1); a[x][y] = a[x + 1][y] = -1; } } int main() { memset(a,-1,sizeof(a)); ans = 0; dfs(1); cout<<ans<<endl; return 0; }
