2017 蓝桥杯决赛 C++B(2)瓷砖样式 dfs + hash去重

2024-04-05 23:48

本文主要是介绍2017 蓝桥杯决赛 C++B(2)瓷砖样式 dfs + hash去重,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

标题:磁砖样式

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

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


答案: 101466


#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<map>
using namespace std;int mp[4][11];
map<int,int> hash;
int tol;bool noSame()//判断是否存在4个方块同样 {for(int i = 1; i <= 2; ++i){for(int j = 1; j <= 9; ++j){if(mp[i][j] == mp[i+1][j] && mp[i+1][j] == mp[i][j+1] && mp[i][j+1] == mp[i+1][j+1])return false;}}return true;}void color(int x, int y, int type,int v)//根据type判断水平2块还是数值2块  染成 v {if(type == 1){ //水平 for(int i = x; i < x+1; ++i){for(int j = y; j < y+2; ++j){mp[i][j] = v;}}}else if(type == 2){for(int i = x; i < x+2; ++i){for(int j = y; j < y+1; ++j){mp[i][j] = v;}}}}
bool checkX(int x, int y)//判断X方向是否能放2块 {if(x+1 > 3 || y > 10)return false;for(int i = x; i < x+2; ++i){for(int j = y; j < y+1; ++j){if(mp[i][j])return false;}}return true;}void output(){for(int i = 1; i <= 3; ++i){for(int j = 1; j <= 10; ++j){printf("%d",mp[i][j]);}printf("\n");}}	bool checkY(int x, int y)//判断y方向能否放2块 {if(x > 3 || y+1 > 10)return false;for(int i = x; i < x+1; ++i){for(int j = y; j < y+2; ++j){if(mp[i][j])return false;}}	return true;}void dfs(int x, int y){if(x > 3){if(noSame()){int bit = 1;long long ans = 0;for(int i = 1; i <= 3; ++i){for(int j = 1; j <= 10; ++j){ans += bit*mp[i][j];//用ans来标识唯一的涂色方案bit <<= 1;}}if(!hash[ans]){++tol;++hash[ans];}}return ;}	if(mp[x][y] == 0){if(checkX(x,y)){for(int i = 1; i <= 2; ++i){//注意瓷砖有2种 可以染不同颜色 color(x,y,2,i);if(y == 10){dfs(x+1,1);}else{dfs(x,y+1);}color(x,y,2,0);}}if(checkY(x,y)){for(int i = 1; i <= 2; ++i){color(x,y,1,i);if(y == 10){dfs(x+1,1);}else{dfs(x,y+1);}color(x,y,1,0);}}}else{if(y == 10){dfs(x+1,1);}else{dfs(x,y+1);}}}int main(){memset(mp,0,sizeof(mp));dfs(1,1);printf("%d",tol);return 0;}

这篇关于2017 蓝桥杯决赛 C++B(2)瓷砖样式 dfs + hash去重的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/878486

相关文章

C++使用栈实现括号匹配的代码详解

《C++使用栈实现括号匹配的代码详解》在编程中,括号匹配是一个常见问题,尤其是在处理数学表达式、编译器解析等任务时,栈是一种非常适合处理此类问题的数据结构,能够精确地管理括号的匹配问题,本文将通过C+... 目录引言问题描述代码讲解代码解析栈的状态表示测试总结引言在编程中,括号匹配是一个常见问题,尤其是在

使用C++实现链表元素的反转

《使用C++实现链表元素的反转》反转链表是链表操作中一个经典的问题,也是面试中常见的考题,本文将从思路到实现一步步地讲解如何实现链表的反转,帮助初学者理解这一操作,我们将使用C++代码演示具体实现,同... 目录问题定义思路分析代码实现带头节点的链表代码讲解其他实现方式时间和空间复杂度分析总结问题定义给定

C++初始化数组的几种常见方法(简单易懂)

《C++初始化数组的几种常见方法(简单易懂)》本文介绍了C++中数组的初始化方法,包括一维数组和二维数组的初始化,以及用new动态初始化数组,在C++11及以上版本中,还提供了使用std::array... 目录1、初始化一维数组1.1、使用列表初始化(推荐方式)1.2、初始化部分列表1.3、使用std::

C++ Primer 多维数组的使用

《C++Primer多维数组的使用》本文主要介绍了多维数组在C++语言中的定义、初始化、下标引用以及使用范围for语句处理多维数组的方法,具有一定的参考价值,感兴趣的可以了解一下... 目录多维数组多维数组的初始化多维数组的下标引用使用范围for语句处理多维数组指针和多维数组多维数组严格来说,C++语言没

c++中std::placeholders的使用方法

《c++中std::placeholders的使用方法》std::placeholders是C++标准库中的一个工具,用于在函数对象绑定时创建占位符,本文就来详细的介绍一下,具有一定的参考价值,感兴... 目录1. 基本概念2. 使用场景3. 示例示例 1:部分参数绑定示例 2:参数重排序4. 注意事项5.

使用C++将处理后的信号保存为PNG和TIFF格式

《使用C++将处理后的信号保存为PNG和TIFF格式》在信号处理领域,我们常常需要将处理结果以图像的形式保存下来,方便后续分析和展示,C++提供了多种库来处理图像数据,本文将介绍如何使用stb_ima... 目录1. PNG格式保存使用stb_imagephp_write库1.1 安装和包含库1.2 代码解

C++实现封装的顺序表的操作与实践

《C++实现封装的顺序表的操作与实践》在程序设计中,顺序表是一种常见的线性数据结构,通常用于存储具有固定顺序的元素,与链表不同,顺序表中的元素是连续存储的,因此访问速度较快,但插入和删除操作的效率可能... 目录一、顺序表的基本概念二、顺序表类的设计1. 顺序表类的成员变量2. 构造函数和析构函数三、顺序表

使用C++实现单链表的操作与实践

《使用C++实现单链表的操作与实践》在程序设计中,链表是一种常见的数据结构,特别是在动态数据管理、频繁插入和删除元素的场景中,链表相比于数组,具有更高的灵活性和高效性,尤其是在需要频繁修改数据结构的应... 目录一、单链表的基本概念二、单链表类的设计1. 节点的定义2. 链表的类定义三、单链表的操作实现四、

CSS自定义浏览器滚动条样式完整代码

《CSS自定义浏览器滚动条样式完整代码》:本文主要介绍了如何使用CSS自定义浏览器滚动条的样式,包括隐藏滚动条的角落、设置滚动条的基本样式、轨道样式和滑块样式,并提供了完整的CSS代码示例,通过这些技巧,你可以为你的网站添加个性化的滚动条样式,从而提升用户体验,详细内容请阅读本文,希望能对你有所帮助...

使用C/C++调用libcurl调试消息的方式

《使用C/C++调用libcurl调试消息的方式》在使用C/C++调用libcurl进行HTTP请求时,有时我们需要查看请求的/应答消息的内容(包括请求头和请求体)以方便调试,libcurl提供了多种... 目录1. libcurl 调试工具简介2. 输出请求消息使用 CURLOPT_VERBOSE使用 C