标签:string 二进制 cto 现在 长方形 user 内容 部分 color
小明家的一面装饰墙原来是 3*10 的小方格。
现在手头有一批刚好能盖住2个小方格的长方形瓷砖。
瓷砖只有两种颜色:黄色和橙色。
小明想知道,对于这么简陋的原料,可以贴出多少种不同的花样来。
小明有个小小的强迫症:忍受不了任何2*2的小格子是同一种颜色。
(瓷砖不能切割,不能重叠,也不能只铺一部分。另外,只考虑组合图案,请忽略瓷砖的拼缝)
显然,对于 2*3 个小格子来说,口算都可以知道:一共10种贴法,如【p1.png所示】
但对于 3*10 的格子呢?肯定是个不小的数目,请你利用计算机的威力算出该数字。
注意:你需要提交的是一个整数,不要填写任何多余的内容(比如:说明性文字)
答案:(47分)
代码:
#include <iostream> #include <cstring> #include <cstdio> #include <cmath> #include <vector> #include <algorithm> #include <queue> #include <map> #define xx 3 #define yy 4 using namespace std; int s[5][12],c; map<int,int> q;///每种摆放用01表示不同颜色,则可以组成不同的30位二进制数,标记每一种摆放是否重复(后面重复肯定是有的) int check(int x,int y)///判断xy位置与周围形成的任何四个格子是否冲突 { for(int i = x - 1;i <= x;i ++) { for(int j = y - 1;j <= y;j ++) { int d = (s[i][j] == s[i + 1][j + 1]) + (s[i][j] == s[i][j + 1]) + (s[i + 1][j] == s[i][j]); if(d == 3)return 0; } } return 1; } int dele() { int d = 0; for(int i = 1;i <= xx;i ++) { for(int j = 1;j <= yy;j ++) { d = d * 2 + s[i][j]; } } if(q[d]) { cout<<d<<endl; return 0; } return q[d] = 1; } void dfs(int x,int y) { if(x == xx + 1) { if(dele())c ++; return; } if(s[x][y] == -1) { if(s[x + 1][y] == -1) { for(int k = 0;k < 2;k ++) { s[x][y] = s[x + 1][y] = k; if(check(x,y) && check(x + 1,y))dfs(x + y / yy,y % yy + 1); } s[x][y] = s[x + 1][y] = -1; } if(s[x][y + 1] == -1) { for(int k = 0;k < 2;k ++) { s[x][y] = s[x][y + 1] = k; if(check(x,y) && check(x,y + 1))dfs(x + y / yy,y % yy + 1); } s[x][y] = s[x][y + 1] = -1; } } else dfs(x + y / yy,y % yy + 1); } int main() { for(int i = 1;i <= xx;i ++) { for(int j = 1;j <= yy;j ++) { s[i][j] = -1; } } for(int i = 1;i <= yy;i ++) { s[xx + 1][i] = -2; s[0][i] = -2; } for(int i = 1;i <= xx;i ++) { s[i][yy + 1] = -2; s[i][0] = -2; } dfs(1,1); cout<<c; }
标签:string 二进制 cto 现在 长方形 user 内容 部分 color
原文地址:https://www.cnblogs.com/8023spz/p/9066675.html