测评会员优惠活动进行中 · 开通 VIP,有效期内测评不限次 VIP 优惠中 · 测评不限次 立即查看

A40825. 瓷砖样式

填空题 困难

题目描述

瓷砖样式

题目描述

小明家的一面装饰墙原来是 3 × 10 的小方格。现在手头有一批刚好能盖住 2 个小方格的长方形瓷砖。

瓷砖只有两种颜色:黄色和橙色。小明想知道,对于这么简陋的原料,可以贴出多少种不同的花样来。

小明有个小小的强迫症:忍受不了任何 2 × 2 的小格子是同一种颜色。

瓷砖不能切割,不能重叠,也不能只铺一部分。另外,只考虑组合图案,请忽略瓷砖的拼缝

显然,对于 2 × 3 个小格子来说,口算都可以知道:一共 10 种贴法,如图所示:

但对于 3 ×10 的格子呢?肯定是个不小的数目,请你利用计算机的威力算出该数字。

答案提交

注意:你需要提交的是一个整数,不要填写任何多余的内容(比如:说明性文字)

参考答案

#include <iostream> #include <cstring> #include <cstdio> #include <set> using namespace std; int g[20][20]; set<string> st; bool judge() // 判断是否同色 { for (int i = 1; i < 3; i ++) for (int j = 1; j < 10; j ++) { if((g[i][j] + g[i][j + 1] + g[i + 1][j] + g[i + 1][j + 1]) % 4 == 0) return false; } return true; } void dfs(int x, int y) { if(x == 4) { if(judge()) { string ans = ""; for (int i = 1; i <= 3; i ++) for (int j = 1; j <= 10; j ++) { char str[5]; sprintf(str, "%d", g[i][j]); // 整数转字符串 ans += str; } st.insert(ans); } return; } if(g[x][y] == -1) // 还没铺放瓷砖 { if(y + 1 <= 10 && g[x][y + 1] == -1) // 横着放 { for (int i = 0; i < 2; i ++) { g[x][y] = g[x][y + 1] = i; if(y + 2 <= 10) dfs(x, y + 2); else dfs(x + 1, 1); g[x][y] = g[x][y + 1] = -1; } } if(x + 1 <= 3 && g[x + 1][y] == -1) // 竖着放 { for (int i = 0; i < 2; i ++) { g[x][y] = g[x + 1][y] = i; if(y + 1 <= 10) dfs(x, y + 1); else dfs(x + 1, 1); g[x][y] = g[x + 1][y] = -1; } } } else { if(y == 10) dfs(x + 1, 1); // 换行 else dfs(x, y + 1); } } int main() { memset(g, -1, sizeof g); dfs(1, 1); cout << st.size() << endl; return 0; }

答案解析

答案:101466

上一题 下一题