蓝桥杯第八届国赛第二题:瓷砖样式

2024-03-28 03:59

本文主要是介绍蓝桥杯第八届国赛第二题:瓷砖样式,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

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

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

样例
在这里插入图片描述
答案:101466

#include <iostream> 
#include <stdio.h>
#include <string.h>
#include <map>
#include <algorithm>
using namespace std;
const int w = 3, h = 10;  // 高 、宽 
int graph[w][h];  // 墙 
int ans = 0; //方案数 map<int, int> Hash; //用此来去重 //检查2x2格子颜色是否相同 
bool check_color() {for(int i = 0; i < w; i++) //行 for(int j = 0; j < h; j++) { //列 if(i+1 < w && j+1 < h) {if((graph[i][j]+graph[i][j+1]+graph[i+1][j]+graph[i+1][j+1]) % 4 == 0) return false; //相同 }}return true; //不同 
}void fill_with_tile(int x, int y) {if(x>w-1||y>h-1){return ;}//未访问 ; 每个位置共有两种摆放方式 if(graph[x][y] == -1) {  //方式一:横向摆放 前提: 该位置同行的下个格子有空才行 if(y+1 < h && graph[x][y+1] == -1) {// 0:黄色、1:橙色 for(int i = 0; i < 2; i++) { graph[x][y] = i;graph[x][y+1] = i;if(y == h-1) {  fill_with_tile(x+1, 0); //铺下一行} else {fill_with_tile(x, y+1); //铺当前行的下一个格子}graph[x][y] = -1;graph[x][y+1] = -1;}}//方式二: 纵向摆放 if(x+1 < w && graph[x+1][y] == -1) {// 0:黄色、1:橙色 for(int i = 0; i < 2; i++) {graph[x][y] = i;graph[x+1][y] = i;if(y == h-1) {  fill_with_tile(x+1, 0); //铺下一行} else {        fill_with_tile(x, y+1); //铺当前行的下一个格子}graph[x][y] = -1;graph[x+1][y] = -1;}}} //以访问 else {if(x == w-1 && y == h-1) { //成功铺满 if(check_color()) { //检查2x2格子颜色是否相同 //自编一个哈希函数,为此摆放方式确定一个键值 int ret = 0, bit = 1;for(int i = 0; i < w; i++){ for(int j = 0; j < h; j++) {ret += graph[i][j] * bit;bit *= 2;}} // count()函数返回map中键值等于key的元素的个数。 if(!Hash.count(ret)) { // 只有返回 0 时才会进入 Hash[ret] = 1;// 这个赋值是随意的 ans++;}}return;}//接下来的这对if~else就是核心 if(y == h-1) { fill_with_tile(x+1, 0); // 铺下一行} else {                fill_with_tile(x, y+1);// 铺当前行的下一个格子}}
}int main() {memset(graph, -1, sizeof(graph));//将数组初始化 fill_with_tile(0, 0); //从第一个位置开始 printf("%d\n", ans);return 0;
}
#include <iostream> 
#include <cstdio>using namespace std;
int a[5][12];
int count=0;//判断任意2*2的区域内颜色是否相同 :不用担心数组越界问题 
bool judge(int x,int y){//作为右下角 if(a[x][y]==a[x-1][y-1] && a[x][y]==a[x-1][y] && a[x][y]==a[x][y-1])return false;// 作为左下角 if(a[x][y]==a[x-1][y] && a[x][y]==a[x-1][y+1] && a[x][y]==a[x][y+1])return false;// 作为右上角 if(a[x][y]==a[x][y-1] && a[x][y]==a[x+1][y-1] && a[x][y]==a[x+1][y])return false;// 作为左上角 if(a[x][y]==a[x][y+1] && a[x][y]==a[x+1][y] && a[x][y]==a[x+1][y+1])return false;return true;
}void dfs(int x,int y){  if(x==3&&y==10){ //铺满了 count++;return;}if(y>10){ //必不可少 dfs(x+1,1);return; //这个return也是用的超棒的 ,避免了重复计数 }//未被访问 if(a[x][y]==-1){if(a[x][y+1]==-1){ //如果它右边的位置可以访问 //贴黄色 a[x][y]=1;a[x][y+1]=1;if(judge(x,y)){ //这个很 dfs(x,y+1);}a[x][y]=-1;//回溯 a[x][y+1]=-1;//贴橙色 a[x][y]=2;a[x][y+1]=2;if(judge(x,y)){dfs(x,y+1);}a[x][y]=-1;a[x][y+1]=-1;}if(a[x+1][y]==-1){ //如果它下面的位置可以被访问 a[x][y]=1;a[x+1][y]=1;if(judge(x,y)){dfs(x,y+1);}a[x][y]=-1;a[x+1][y]=-1;a[x][y]=2;a[x+1][y]=2;if(judge(x,y)){dfs(x,y+1);}a[x][y]=-1;a[x+1][y]=-1;}}//已被访问 else{dfs(x,y+1);}}
int main(){for(int i=1;i<=3;i++){for(int j=1;j<=10;j++){a[i][j]=-1;}}//由于坐标是从1开始并且数组比原本的大因此不必考虑是否越界的问题 dfs(1,1);printf("%d",count);return 0;
}

这篇关于蓝桥杯第八届国赛第二题:瓷砖样式的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

闲置电脑也能活出第二春?鲁大师AiNAS让你动动手指就能轻松部署

对于大多数人而言,在这个“数据爆炸”的时代或多或少都遇到过存储告急的情况,这使得“存储焦虑”不再是个别现象,而将会是随着软件的不断臃肿而越来越普遍的情况。从不少手机厂商都开始将存储上限提升至1TB可以见得,我们似乎正处在互联网信息飞速增长的阶段,对于存储的需求也将会不断扩大。对于苹果用户而言,这一问题愈发严峻,毕竟512GB和1TB版本的iPhone可不是人人都消费得起的,因此成熟的外置存储方案开

《数据结构(C语言版)第二版》第八章-排序(8.3-交换排序、8.4-选择排序)

8.3 交换排序 8.3.1 冒泡排序 【算法特点】 (1) 稳定排序。 (2) 可用于链式存储结构。 (3) 移动记录次数较多,算法平均时间性能比直接插入排序差。当初始记录无序,n较大时, 此算法不宜采用。 #include <stdio.h>#include <stdlib.h>#define MAXSIZE 26typedef int KeyType;typedef char In

CSP 2023 提高级第一轮 CSP-S 2023初试题 完善程序第二题解析 未完

一、题目阅读 (最大值之和)给定整数序列 a0,⋯,an−1,求该序列所有非空连续子序列的最大值之和。上述参数满足 1≤n≤105 和 1≤ai≤108。 一个序列的非空连续子序列可以用两个下标 ll 和 rr(其中0≤l≤r<n0≤l≤r<n)表示,对应的序列为 al,al+1,⋯,ar​。两个非空连续子序列不同,当且仅当下标不同。 例如,当原序列为 [1,2,1,2] 时,要计算子序列 [

C语言蓝桥杯

一、语言基础 竞赛常用库函数 最值查询 min_element和max_element在vector(迭代器的使用) nth_element函数的使用 例题lanqiao OJ 497成绩分析 第一种用min_element和max_element函数的写法 第二种用min和max的写法 二分查找 二分查找只能对数组操作 binary_s

2024年高教社杯数学建模国赛最后一步——结果检验-事关最终奖项

2024年国赛已经来到了最后一天,有必要去给大家讲解一下,我们不需要过多的去关注模型的结果,因为模型的结果的分值设定项最多不到20分。但是如果大家真的非常关注的话,那有必要给大家讲解一下论文结果相关的问题。很多的论文,上至国赛优秀论文下至不获奖的论文并不是所有的论文都可以进行完整的复现求解,大部分数模论文都为存在一个灰色地带。         白色地带即认为所有的代码均可运行、公开

在项目开发中,jsp页面不会少了,如何公用页面(添加页面和修改页面)和公用样式代码(css,js)?

在项目开发中,如何公用添加页面和修改页面? <%@ page language="java" import="java.util.*" pageEncoding="utf-8"%><html><head><title>岗位设置</title><%@ include file="/WEB-INF/jsp/public/common.jspf"%></head><body> <!-- 标

【全网最全】2024年数学建模国赛A题30页完整建模文档+17页成品论文+保奖matla代码+可视化图表等(后续会更新)

您的点赞收藏是我继续更新的最大动力! 一定要点击如下的卡片,那是获取资料的入口! 【全网最全】2024年数学建模国赛A题30页完整建模文档+17页成品论文+保奖matla代码+可视化图表等(后续会更新)「首先来看看目前已有的资料,还会不断更新哦~一次购买,后续不会再被收费哦,保证是全网最全资源,随着后续内容更新,价格会上涨,越早购买,价格越低,让大家再也不需要到处买断片资料啦~💰💸👋」�

【2024高教社杯国赛C题】数学建模国赛建模过程+完整代码论文全解全析

你是否在寻找数学建模比赛的突破点?数学建模进阶思路! 作为经验丰富的数学建模团队,我们将为你带来2024国赛数学建模竞赛(C题)的全面解析。这个解决方案包不仅包括完整的代码实现,还有详尽的建模过程和解析,帮助你全面理解并掌握如何解决类似问题。 完整内容在文章末尾阅读全文获取! C题的第一问是: 假定各种农作物未来的预期销售量、种植成本、亩产量和销售价格相对于 2023 年保持稳定,每季

2024国赛论文拿奖快对照这几点及评阅要点,勿踩雷区!(国赛最后冲刺,提高获奖概率)

↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑ 2024“高教社杯”全国大学生数学建模竞赛已过去第三个夜晚,小伙伴们都累了没有,如果感到思维滞涩,别忘了稍作休息,放松一下自己,准备迎接国赛非常重要的收尾阶段——论文。 国赛这几天的努力最后都

纯css实现checkbox的checked样式

纯css也能实现checked样式 今天使用微信的WEUI的checkbox的时候,发现点击checkbox是有checked和unchecked的变化的,但是想要去获得checkbox的checked状态时,发现event listener里居然没有该checkbox的click之类的事件。这才发现,weui只是纯粹的css样式,没有对应组件的js代码。那么问题来了,没有js事件,weui是如