标题:磁砖样式
小明家的一面装饰墙原来是 3*10 的小方格。
现在手头有一批刚好能盖住2个小方格的长方形瓷砖。
瓷砖只有两种颜色:黄色和橙色。
小明想知道,对于这么简陋的原料,可以贴出多少种不同的花样来。
小明有个小小的强迫症:忍受不了任何2*2的小格子是同一种颜色。
(瓷砖不能切割,不能重叠,也不能只铺一部分。另外,只考虑组合图案,请忽略瓷砖的拼缝)
显然,对于 2*3 个小格子来说,口算都可以知道:一共10种贴法,如【p1.png所示】


大致思路:

有一点需要提醒,两重for循环搜到最近的一个可以落子的起点后,在执行完迭代后进行return,返回上一级;
本题的hash的方法是把每个点的颜色用0或者1进行表示,然后将这三十位变成2进制串进行联合,再转化成10进制存进set中。
刚开始错误地开了两重for循环来枚举每个点,导致搜索炸了,并出现大量的重复计算;还有,我的开始的去重方法是set<string>has;也就是把30个数按顺序存成字符串,最后加进set里面。

很努力的题解:

 1 using namespace std;
 2 int a[4][11];
 3 int n,m;
 4 int dir[2][2]={{0,1},{1,0} };
 5
 6 int is_range(int x,int y){//判断当前点在范围内返回1
 7     if(x<1||x>n||y>m||y<1)
 8         return 0;
 9     return 1;
10 }
11 int grid(int x,int y){
12     if(is_range(x-1,y-1)==0)return 0;//判断右下角起往左上 是否出现2*2的小格子是同一种颜色
13     int t=a[x][y];
14     if(t!=-1&&t==a[x-1][y]&&t==a[x][y-1]&&t==a[x-1][y-1])
15         return 1;
16     return 0;
17 }
18 set<int>has;
19
20 int gethash(int a[][11],int n,int m){//将整个图用string的“01”串进行存进来
21     int s=0;
22     for(int i=1;i<=n;i++){
23         for(int j=1;j<=m;j++){
24             s=(s<<1) + a[i][j];
25            // s+=ch;
26         }
27     }
28     return s;
29 }
30
31 int ans=0;
32 int check(int i0,int j0,int i1,int j1){
33     if(grid(i0,j0)||grid(i1,j1))
34         return 1;
35     return 0;
36 }
37 void dfs(int i0,int j0,int i1,int j1,int step,int n,int m){//step表示本次搜索应该搜索第step块了
38     if(check(i0,j0,i1,j1)==1)//出现四块瓷砖是相同的
39         return ;
40     if(step==16){  ///搜索结束条件,全局已经铺满了15个方块数了
41         int str=gethash(a,n,m);//返回当前局面
42         if(has.count(str)==0){
43             ans++;has.insert(str);
44             printf("**step=%d,a[]=%10d,ans=%4d\n",step,str,ans);
45         }
46
47         return ;
48     }
49       //int str=gethash(a,n,m);//返回当前局面printf("  step=%d,a[]=%10d,ans=%4d\n",step,str,ans);
50
51     for(int i=1;i<=n;i++){
52         for(int j=1;j<=m;j++){
53             if(a[i][j]==-1){      //该地为空
54                 for(int k=0;k<=1;k++){//横着或者竖着放一块瓷砖;
55                     int dx,dy;
56                     dx=i+dir[k][0];
57                     dy=j+dir[k][1];
58                     if(is_range(dx,dy)==0||a[dx][dy]!=-1)continue;//越界,重复
59                     for(int col=0;col<=1;col++){   //两种颜色
60                         a[i][j]=a[dx][dy]=col;
61                         dfs(i,j,dx,dy,step+1,n,m);
62                         a[i][j]=a[dx][dy]=-1;
63                     }
64                 }
65                 return ;
66             }
67         }
68     }
69     return ;
70 }
71
72 int main(){
73     ans=0;
74     has.clear();//清空set
75     memset(a,-1,sizeof(a));//瓷砖黄色——值0,瓷砖橙色--1
76    // n=2;m=3;
77     n=3;m=10;
78     dfs(0,0,0,0,1,n,m);
79     printf("%d\n",ans);
80
81     return 0;
82 }

View Code(代码有详细注释)


上图是n=2,m=3,(注意要在图示中的地方,step修改为4)时的结果10;——过了题目的样例;
下图是n=3,m=10,(在图示中的地方,step修改为16)时的结果,最终答案为120302。

———————所以本题我的最终答案是120302!———————————

转载于:https://www.cnblogs.com/zhazhaacmer/p/9046132.html

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

  1. 2012年第三届蓝桥杯C/C++程序设计本科B组决赛 拼音字母(编程大题)

    2012年第三届蓝桥杯C/C++程序设计本科B组决赛题目汇总: http://blog.csdn.net/u014552756/article/details/51399827 拼音字母 在很多软件中 ...

  2. 2015年第六届蓝桥杯C/C++程序设计本科B组决赛

    1.积分之谜(枚举) 2.完美正方形 3.关联账户(并查集) 4.密文搜索 5.居民集会 6.模型染色 1.积分之迷 小明开了个网上商店,卖风铃.共有3个品牌:A,B,C. 为了促销,每件商品都会返固 ...

  3. 2015年第六届蓝桥杯C/C++程序设计本科B组决赛 ——居民集会(编程大题)

    标题:居民集会 蓝桥村的居民都生活在一条公路的边上,公路的长度为L,每户家庭的 位置都用这户家庭到公路的起点的距离来计算,第i户家庭距起点的距 离为di.每年,蓝桥村都要举行一次集会.今年,由于村里的 ...

  4. 2015年第六届蓝桥杯C/C++程序设计本科B组决赛第二题

    http://www.docin.com/p-506195687.html 这样算不算写了一道题.... 完美正方形 如果一些边长互不相同的正方形,可以恰好拼出一个更大的正方形,则称其为完美正方形. ...

  5. 2012年第三届蓝桥杯C/C++程序设计本科B组决赛

    1.星期几(取余/excel) 2.数据压缩 3.拼音字母(比较) 4.DNA比对(dp) 5.方块填数 1.星期几 [结果填空] (满分5分)     1949年的国庆节(10月1日)是星期六.  ...

  6. c语言程序设计正方体,2015年第六届蓝桥杯C/C++程序设计本科B组决赛 完美正方形...

    完美正方形 如果一些边长互不相同的正方形,可以恰好拼出一个更大的正方形,则称其为完美正方形.历史上,人们花了很久才找到了若干完美正方形.比如:如下边长的22个正方形 2 3 4 6 7 8 12 13 ...

  7. 2015年第六届蓝桥杯C/C++程序设计本科B组省赛 星系炸弹(日期推算)

    星系炸弹 在X星系的广袤空间中漂浮着许多X星人造"炸弹",用来作为宇宙中的路标. 每个炸弹都可以设定多少天之后爆炸. 比如:阿尔法炸弹2015年1月1日放置,定时为15天,则它在2 ...

  8. 第三届蓝桥杯C/C++程序设计本科B组省赛题解

    1.微生物增殖** 题目: 假设有两种微生物 X 和 Y X出生后每隔3分钟分裂一次(数目加倍),Y出生后每隔2分钟分裂一次(数目加倍). 一个新出生的X,半分钟之后吃掉1个Y,并且,从此开始,每隔1 ...

  9. 第十届蓝桥杯大赛青少年创意编程C++组省赛 第1题 水下探测器

    /* 第十届蓝桥杯大赛青少年创意编程C++组省赛 第1题 水下探测器(刘昕源)水下探测器可以潜入湖中在任意水深进行科学探索.湖水的最大深度为 h 米,即它在湖底时到水面的距离,0<=h<= ...

最新文章

  1. 【整理】NSTimer使用及注意事项
  2. python装饰器实例-基于Python 装饰器装饰类中的方法实例
  3. 利用Spring框架封装的JavaMail现实同步或异步邮件发送
  4. 趋势发展之人工智能,入行要趁早
  5. selenium启动firefox时加载扩展
  6. python中的多线程-共享全局变量
  7. Gartner 最新预测:全球云收入将超非云收入,云原生、低代码、SASE 继续普及
  8. 三、面向对象——9-初始化块
  9. 幽默度识别第一名解决方案代码及说明
  10. Java回调机制总结
  11. Java旅游管理系统
  12. Linux之kill命令
  13. 微软更新补丁下载地址
  14. C语言字符与数字的互转
  15. 安全报告处理 HCL AppScan Standard
  16. 读书有益——》《写在人生边上》钱钟书的经典语句( 一)
  17. c语言分段函数x2-sinx,大学高等数学: 第二章第五讲三种分段函数求导法, 再也不担心了...
  18. 使用 Mono.Cecil 辅助 Unity3D 手游进行性能测试
  19. 我在达芬奇的笔记本里,找到了用户画像的起源
  20. Android 页面Scheme配置

热门文章

  1. ros2中vcs import src < ros2.repos 命令
  2. polyline与polygon
  3. php rn 返回,rn滑动返回页面监听 - osc_13a0punx的个人空间 - OSCHINA - 中文开源技术交流社区...
  4. GPS与LBS的差别
  5. 加拿大移民政策调整,注意,这些可能会影响到你
  6. Windows注册表内容详解(转载)
  7. iOS清除WKWebView缓存
  8. RAS--远程访问服务
  9. 春季养生食谱 灵芝孢子粉牛排汤补中益气
  10. Windows电脑怎么查看自己的电脑是64位的?