标题:磁砖样式

小明家的一面装饰墙原来是 3*10 的小方格。
现在手头有一批刚好能盖住2个小方格的长方形瓷砖。
瓷砖只有两种颜色:黄色和橙色。

小明想知道,对于这么简陋的原料,可以贴出多少种不同的花样来。
小明有个小小的强迫症:忍受不了任何2∗22*22∗2的小格子是同一种颜色。
(瓷砖不能切割,不能重叠,也不能只铺一部分。另外,只考虑组合图案,请忽略瓷砖的拼缝)
显然,对于 2∗32*32∗3个小格子来说,口算都可以知道:一共10种贴法,如【p1.png所示】

但对于3∗103*103∗10 的格子呢?肯定是个不小的数目,请你利用计算机的威力算出该数字。
注意:你需要提交的是一个整数,不要填写任何多余的内容(比如:说明性文字)

答案:101466

分析

  • 对于这道题,我们只要枚举出所以的磁砖铺设情况,统计出满足要求的情况个数就能解出这道题了。但是怎么枚举,如何判断是否满足要求,如何记录当前满足条件的铺设情况。下面我们来解决这些问题:
  1. 枚举的方法
    我们先规定一种铺设方式:先一行一行地铺,当这当前行铺满了,再去铺下一行。磁砖可以横向铺设,也可以竖向铺设,我们可以分开写成两个部分,根据当前行剩余的空位来选择横向铺设还是纵向铺设。对于各个位置状态的标记,如果没有铺设,该位置的状态值为-1;如果铺黄色,该位置的状态值为0;如果橙色,该位置的状态值为1。
  2. 判断是否满足要求
    只要任意2∗22*22∗2的小方格里面状态值的和不为0和4就可以判断为符合条件。
  3. 记录当前铺设情况
    一共有30个位置,每个位置都只有两种状态(橙色或者黄色),我们可以用二进制来进行状态记录,然后把状态值放进一个集合中(集合中的元素不会重复),最后把集合的大小输出即可得到花样总数。

代码如下

import java.util.*;public class Main {final static int r=3,c=10;static int a[][]=new int [r][c];static Set<Integer> set=new HashSet<>();static boolean check() {for(int i=0;i<r-1;i++)for(int j=0;j<c-1;j++)if((a[i][j]+a[i+1][j]+a[i][j+1]+a[i+1][j+1])%4==0)return false;return true;}static void dfs(int x,int y) {if(a[x][y]==-1) {//横向铺设if(y+1<c && a[x][y+1]==-1) {for(int i=0;i<2;i++) {a[x][y]=a[x][y+1]=i;if(y==c-1) {dfs(x+1, 0);}else {dfs(x, y+1);}a[x][y]=a[x][y+1]=-1;//backtracking}}//竖向铺设if(x+1<r && a[x+1][y]==-1) {for(int i=0;i<2;i++) {a[x][y]=a[x+1][y]=i;if(y==c-1) {dfs(x+1, 0);}else {dfs(x, y+1);}a[x][y]=a[x+1][y]=-1;//backtracking}}}else {if(y==c-1 && x==r-1) {if(check()) {int res=0;for(int i=0;i<r;i++)for(int j=0;j<c;j++) res=(res<<1)+a[i][j];set.add(res);}return;}//if there is still space leftif(y==c-1) {dfs(x+1, 0);}else {dfs(x, y+1);}}}public static void main(String[] args) {for(int i=0;i<r;i++)Arrays.fill(a[i], -1);dfs(0, 0);System.out.println(set.size());}
}

第八届蓝桥杯决赛 磁砖样式(枚举)相关推荐

  1. 第八届蓝桥杯决赛 磁砖样式

    标题:磁砖样式 小明家的一面装饰墙原来是 3*10 的小方格. 现在手头有一批刚好能盖住2个小方格的长方形瓷砖. 瓷砖只有两种颜色:黄色和橙色. 小明想知道,对于这么简陋的原料,可以贴出多少种不同的花 ...

  2. 2017第八届蓝桥杯决赛(大学B组)java试题 瓷砖样式

    标题:磁砖样式 小明家的一面装饰墙原来是 3*10 的小方格. 现在手头有一批刚好能盖住2个小方格的长方形瓷砖. 瓷砖只有两种颜色:黄色和橙色. 小明想知道,对于这么简陋的原料,可以贴出多少种不同的花 ...

  3. 记2017第八届蓝桥杯决赛(国赛)—北京三日游

    离蓝桥杯国赛结束也已经有很多天了,这段时间也一直没怎么做题,也好久没打开csdn了,今天又重新捡起来,所以来随意扯一下这次的北京三日游.......啊不,2017第八届蓝桥杯. 这已经是我第二次打蓝桥 ...

  4. 第八届蓝桥杯决赛 平方十位数(枚举)

    标题:平方十位数 由0~9这10个数字不重复.不遗漏,可以组成很多10位数字. 这其中也有很多恰好是平方数(是某个数的平方). 比如:1026753849,就是其中最小的一个平方数. 请你找出其中最大 ...

  5. 第八届蓝桥杯决赛题之平方十位数

    看到题目首先想到用枚举,从最大到最小 思路1 1.枚举答案X[9876543210,,126753849] 2.判断x是不是恰好是0~9十个数字 3.判断是不是完全平方数 1)令Y = int(sqr ...

  6. 第八届蓝桥杯决赛 图书排列

    标题:图书排列 将编号为1~10的10本书排放在书架上,要求编号相邻的书不能放在相邻的位置. 请计算一共有多少种不同的排列方案. 注意,需要提交的是一个整数,不要填写任何多余的内容. 答案:47930 ...

  7. c语言一行黑白相间的瓷砖,磁砖样式——第八届蓝桥杯C语言B组(国赛)第二题...

    原创 标题:磁砖样式 小明家的一面装饰墙原来是 3*10 的小方格. 现在手头有一批刚好能盖住2个小方格的长方形瓷砖. 瓷砖只有两种颜色:黄色和橙色. 小明想知道,对于这么简陋的原料,可以贴出多少种不 ...

  8. 第八届蓝桥杯C/C++程序设计本科B组决赛 ——瓷砖样式(填空题)【DP?我的暴力排列搜索】...

    标题:磁砖样式 小明家的一面装饰墙原来是 3*10 的小方格. 现在手头有一批刚好能盖住2个小方格的长方形瓷砖. 瓷砖只有两种颜色:黄色和橙色. 小明想知道,对于这么简陋的原料,可以贴出多少种不同的花 ...

  9. 第八届B组蓝桥杯决赛

    历年蓝桥杯决赛题目汇总? 第一题 标题:36进制 对于16进制,我们使用字母A-F来表示10及以上的数字. 如法炮制,一直用到字母Z,就可以表示36进制. 36进制中,A表示10,Z表示35,AA表示 ...

最新文章

  1. lamp不解析php,lamp环境无法解析php环境
  2. python自动化安装软件_python自动化安装源码软件包
  3. 快速幂运算 《挑战程序设计竞赛》
  4. 系统架构设计师面试java架构师 面试经验分享
  5. 遇到:ORA-27121: UNABLE TO DETERMINE SIZE OF SHAR...
  6. 用代码转换整数规划 max{ } 与 min{ } 形式至代码形式
  7. 学习web前端还是UI?先了解Web前端和UI的区别是什么?在选择
  8. 获取Access数据库中的用户表名
  9. 【图像隐写】基于matlab GUI DWT+SVD数字水印【含Matlab源码 606期】
  10. Android修改PackageInstaller自动安装指定应用,android开发网易新闻
  11. JS 字符串分割以及填充
  12. 安全教育思维导图模板分享
  13. Insyde uefi 隐藏设置_UEFI+GPT安装Windows10
  14. gg 修改器游戏被保护_王者荣耀安卓和IOS修改超长游戏名字方法
  15. 学习笔记21.07.09:绘制色块图
  16. iOS8定位问题解决方案
  17. 【水滴云|热点】个人信息安全有法可依,海量数据用IPFS存储
  18. CRM- Salesforce体验报告
  19. Android Studio Chipmunk 2021.2.1.15下载地址
  20. bscroll.js实现html手机端城市列表

热门文章

  1. 三方支付(支付宝为例)
  2. linux pwn练习0x02
  3. 【渗透测试】初探进程伪装
  4. 蓝队视角下的企业安全运营
  5. python获取docx文档的内容(文本)
  6. 160个Crackme023
  7. 静态分析android代码, 循环与trycatch
  8. 注入(一):APC注入
  9. Spring boot使用Bootstrap
  10. Spring boot日志使用