实验一:递归

news2025/7/25 10:03:50

1.铺砖

题目描述:

对于一个2行N列的走道。现在用12或22的砖去铺满。问有多少种不同的方式(请用递推方式求解)。如果N很大,需要高精度计算。下图是一个2行17列的走道的某种铺法:
998398a80f754aacb306cb662383d333

输入要求:

一个整数N,N<=1000。

输出要求:

共有多少种铺法。

#include<bits/stdc++.h>
using namespace std;
/*
    分为三种情况:
    1. 只剩一列,只有一种可能,返回 1
    2. 只剩两列,有三种可能,两个 2*1 或一个 2*2
    3. 大于等于3,进行递推,pave(n - 1) 代表使用 宽度为1的瓷砖,pave(n - 2)代表使用宽度为2的瓷砖,这种情况有三种可能,但是一种两个1*2竖着排列的可能已包含在1中,所以只剩下两种可能。 
*/
long long pave(int n)
{
	if (n == 1)
		return 1;//一个1*2
	else if (n == 2)//1*2 1*2 横竖各一种可能,2*2一种可能
		return 3;
	else
		return pave(n - 1) + 2 * pave(n - 2);//用递归求解,由于1*2 1*2 竖着放和n=1冲突,所以排除了一种。
}
int main()
{
	int n;
	while (cin >> n)
		cout << pave(n) << endl;
	return 0;
}

2.装错信封

题目描述:

某人给N个朋友写信,邀请他们来家中聚会。请柬和信封交由助手去处理。粗心的助手却把请柬全装错了信封。请问:助手会有多少种装错的可能呢?

排错公式:
D ( n ) = ( n − 1 ) [ D ( n − 2 ) + D ( n − 1 ) ] D(n) = (n-1)[D(n-2) + D(n-1)] D(n)=(n1)[D(n2)+D(n1)]

#include<bits/stdc++.h>
using namespace std;
int Fun(int);
int main()
{
    int n,res;
    cin>>n;
    res=Fun(n);
    cout<<res<<endl;
    return 0;
}
int Fun(int n)
{
    if(n==1)  return 0;
    if(n==2)  return 1;
    return (n-1)*(Fun(n-1)+Fun(n-2));
}

3.棋盘覆盖

题目描述

在一个2k×2k 个方格组成的棋盘中,恰有一个方格与其他方格不同,称该方格为一特殊方格,且称该棋盘为一特殊棋盘。在棋盘覆盖问题中,要用图示的4种不同形态的L型骨牌覆盖给定的特殊棋盘上除特殊方格以外的所有方格,且任何2个L型骨牌不得重叠覆盖。

在这里插入图片描述

输入要求

输入一个整数k,k<=5;

输入特殊格子的坐标x,y。

输出要求

输出一个由数值表示的二维矩阵。填充规则如下:

(1)用数值填充方格;

(2)特殊方格数值为0;

(3)从中心点开始;然后左上、右上、左下、右下的计数顺序填数;同一块用相同数值表示;

(4)每个数值占4个位置空间;右对齐,左补空格。

输入样例

3

1 2

输出样例

在这里插入图片描述

#include<bits/stdc++.h>
using namespace std;
int a[40][40],tile = 1;
void ChessBoard(int tr, int tc, int dr, int dc, int size)
{
    //tr:棋盘左上角方格的行号;
    //tc:棋盘左上角方格的列号;
    //dr:特殊方格所在的行号;
    //dc:特殊方格所在的列号。
    
    //每次铺砖后size/2,2*2 铺砖之后size变为1找到特殊方格
    if(size == 1) return;
    //t 为输入的序号,每次填入L方格后+1
    int t = tile++,s = size/2;
    
    //左上、左下、右上、右下的顺序
    //tile:L型骨牌号
    /*
    	步骤:
    	1.判断特殊方格是否在此棋盘中
    	  1.1 不在棋盘中,根据当前方块在特殊方块的什么位置进行填充
    	  1.2 如果在目前棋盘中直接不需要填充,继续棋盘覆盖
    	2.判断是否结束(size/2 == 1)
    	  2.1 是,结束
    	  2.2 否,返回 1
    */
    
    //覆盖左上角子棋盘
    if(dr<tr+s && dc<tc+s)//特殊方格在此棋盘中
        ChessBoard(tr,tc,dr,dc,s);//直接覆盖
    else
    {//方格不在此棋盘中
        a[tr+s-1][tc+s-1]=t;//用t覆盖右下
        ChessBoard(tr,tc,tr+s-1,tc+s-1,s);//覆盖其余
    }
     //覆盖右上角子棋盘
    if(dr<tr+s && dc>=tc+s)//特殊方格在此棋盘中
        ChessBoard(tr,tc+s,dr,dc,s);//直接覆盖
    else
    {//方格不在此棋盘中
        a[tr+s-1][tc+s]=t;//用t覆盖左下
        ChessBoard(tr,tc+s,tr+s-1,tc+s,s);//覆盖其余
    }
         //覆盖左下角子棋盘
    if(dr>=tr+s && dc<tc+s)//特殊方格在此棋盘中
        ChessBoard(tr+s,tc,dr,dc,s);//直接覆盖
    else
    {//方格不在此棋盘中
        a[tr+s][tc+s-1]=t;//用t覆盖右上
        ChessBoard(tr+s,tc,tr+s,tc+s-1,s);//覆盖其余
    }
         //覆盖右下角子棋盘
    if(dr>=tr+s && dc>=tc+s)//特殊方格在此棋盘中
        ChessBoard(tr+s,tc+s,dr,dc,s);//直接覆盖
    else
    {//方格不在此棋盘中
        a[tr+s][tc+s]=t;//用t覆盖左上
        ChessBoard(tr+s,tc+s,tr+s,tc+s,s);//覆盖其余
    }
}

int main()
{
    int k,x,y;
    // 输入
    scanf("%d %d %d", &k, &x, &y);
    // 从左上角开始,进行递推,棋盘的大小为 2^k*2^k
    ChessBoard(0, 0, x, y, pow(2,k));
    // 输出结果
    for(int i=0;i<pow(2,k);i++)
    {
		for(int j=0;j<pow(2,k);j++)
         {
			printf("%4d",a[i][j]);
		}
		printf("\n");
	}
	return 0;
}

4.真币比假币轻

问题描述

找出假币

int find_fake_coin(int* coins, int left, int right)
{
    int n = right - left + 1;
    if (n == 1)
    {  // 如果区间只有一个硬币,它就是假币
        return left;
    }
    int m = n / 2;  // 将硬币分成 2 组
    int left_sum = 0, right_sum = 0;
    for (int i = left; i < left + m; i++)
    {  // 计算左、右两组的重量
        left_sum += coins[i];
    }
    for (int i = left + m; i <= right; i++)
    {
        right_sum += coins[i];
    }
    if (left_sum == right_sum)
    {  // 如果左、右两组的重量相等,则假币在剩余的硬币中
        return find_fake_coin(coins, left + m + 1, right);
    }
    else if (left_sum < right_sum)
    {  // 如果左组比右组轻,则假币在左组中
        return find_fake_coin(coins, left, left + m - 1);
    }
    else
    {  // 如果左组比右组重,则假币在右组中
        return find_fake_coin(coins, left + m, right);
    }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/394824.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

GitHub Copilot 全新升级,工作效率提升 55%

2021年 6 月&#xff0c;GitHub 和 OpenAI 推出了 GitHub Copilot 预览版&#xff0c;可根据命名或者正在编辑的代码上下文为开发者提供代码建议&#xff0c;被称为“你的 AI 结对程序员”。 近日&#xff0c;GitHub 宣布&#xff0c;经过去年 12 月以来的短暂测试后&#xff…

Spring基本概念与使用

文章目录一、Spring概念1.容器2.IoC3.DI4.Ioc与DI的关系二、Spring创建与使用1.Maven2.添加Spring框架支持注&#xff1a;国内的Maven源配置3.简单实例&#xff08;1&#xff09;创建一个Bean对象。&#xff08;2&#xff09;将Bean对象存储到Spring当中&#xff08;3&#xff…

JavaWeb基础

Servlet 是在服务器上运行的小程序。这个词是在 Java applet的环境中创造的&#xff0c;Java applet 是一种当作单独文件跟网页一起发送的小程序&#xff0c;它通常用于在客户端运行&#xff0c;结果得到为用户进行运算或者根据用户互作用定位图形等服务。服务器上需要一些程序…

Jenkins最新版安装调试

清理旧的jenkins&#xff1a; find / -name jenkins* 一项一项的清理&#xff1a;rm -rf /var/log/jenkins* 下载最新版jenkins镜像&#xff1a;jenkins-redhat-stable安装包下载_开源镜像站-阿里云 上传到服务器&#xff1a; 安装命令&#xff1a; yum install -y jenkins…

Excel不愧是宝藏游戏机

你玩过95版Excel自带的游戏彩蛋吗&#xff1f; 众所周知&#xff0c;微软有做彩蛋的传统&#xff0c;这个传统最早是在1979年由比尔盖茨写下的basic复活节彩蛋开始的&#xff0c;当时你只需要输入“WAIT6502,1″,就可以跳出“MICROSOFT!”字符串。到后来&#xff0c;全体微软开…

Redis学习(六):主从复制,发布订阅和实际可能遇到缓存失效的情况

Redis发布订阅 Redis发布订阅&#xff08;Public/Subscribe&#xff09;是一种消息通信模式&#xff1a;发送者发送消息&#xff0c;订阅者接收消息。 Redis客户端可以订阅任意数量的频道。 这张图里有三个角色&#xff1a; 消息发送者频道&#xff08;消息队列&#xff09;…

AIGC时代,大模型微调如何发挥最大作用?

人工智能的快速发展推动了大模型的广泛应用&#xff0c;它们在语言、视觉、语音等领域的应用效果已经越来越好。但是&#xff0c;训练一个大模型需要巨大的计算资源和时间&#xff0c;为了减少这种资源的浪费&#xff0c;微调已经成为一种流行的技术。微调是指在预训练模型的基…

2023年3月全国DAMA-CDGA/CDGP数据管理认证火热报名中...

弘博创新是DAMA中国授权的数据治理人才培养基地&#xff0c;贴合市场需求定制教学体系&#xff0c;采用行业资深名师授课&#xff0c;理论与实践案例相结合&#xff0c;快速全面提升个人/企业数据治理专业知识与实践经验&#xff0c;通过考试还能获得数据专业领域证书。 DAMA认…

【iOS】—— 浅看block源码

block 文章目录block如何通过终端clang生成源码cpp文件block实质截获自动变量全局变量和静态变量的截获__block说明符iOS开发“强弱共舞”——weak和strong配套使用解决block循环引用问题如何通过终端clang生成源码cpp文件 之前在学习block中学习的比较浅&#xff0c;只看了oc…

sentinel源码入门

sentinel是一个流量治理组件&#xff0c;主要用来做降级、熔断和限流&#xff0c;以及监控等&#xff0c;sentinel的使用相对来说比较简单&#xff0c;这篇博客主要介绍sentinel的源码 入口 在使用sentinel的时候&#xff0c;我们需要引入sentinel的相关jar包&#xff0c;然后…

如何使用码匠连接 ClickHouse

目录 在码匠中集成 ClickHouse 在码匠中使用 ClickHouse 关于码匠 ClickHouse 数据源是一种列式数据库管理系统&#xff0c;由俄罗斯 Yandex 公司开发和维护。它专注于高性能、高并发、高可扩展性和低延迟的数据处理&#xff0c;特别是在海量数据的 OLAP&#xff08;联机分析…

性能分析利器:火焰图

什么是火焰图 火焰图&#xff08;FlameGraph&#xff09;是是由 Linux 性能优化大师 Brendan Gregg 发明的。通过 perf 等工具分析得到结果&#xff0c;看起来就像是火焰&#xff0c;这也是它的名字的由来。火焰图以一个全局的视野来看待时间分布&#xff0c;它从底部往顶部&am…

Dockerfile部署SpringBoot项目

Dockerfile部署SpringBoot项目 文章目录 利用Dockerfile部署SpringBoot项目 1、创建一个SpringBooot项目并且打成jar包2、在Linux中创建一个文件夹&#xff0c;来做docker测试3、将jar包上传到Linux中4、编写Dockerfile文件5、制作镜像6、启动容器7、查看容器启动日志8、访问接…

高效能自动化港口数字化码头智慧港航,中国人工智能企业CIMCAI世界港航人工智能领军者,成熟港口码头人工智能产品中国人工智能企业

打造高效能自动化港口数字化码头智慧港航&#xff0c;中国人工智能企业CIMCAI中集飞瞳世界港航人工智能领军者&#xff0c;成熟港口码头人工智能产品全球顶尖AI科技CIMCAI成熟AI产品全球前三船公司及港口落地&#xff0c;包括全球港口/堆场智能闸口验箱&#xff0c;全球港口岸边…

Vulnhub系列:Raven 1

该篇为Vulnhub系列靶机渗透&#xff0c;本次靶机存在4个flag。下面开始我们今天的渗透之旅。Raven靶机有很多种思路&#xff0c;我将对其进行一一整理。首先进行信息收集&#xff0c;利用arp-scan和nmap&#xff0c;进行靶机的ip及端口扫描发现了22、80、111端口。下面访问80端…

【LeetCode】剑指 Offer 23. 链表中环的入口节点 p139 -- Java Version

题目链接&#xff1a;https://leetcode.cn/problems/c32eOV/ 1. 题目介绍&#xff08;23. 链表中环的入口节点&#xff09; 给定一个链表&#xff0c;返回链表开始入环的第一个节点。 从链表的头节点开始沿着 next 指针进入环的第一个节点为环的入口节点。如果链表无环&#x…

怎么清空回收站?3分钟解决!

真实案例&#xff1a;回收站清空不了怎么办&#xff1f;怎样清空回收站里的文件&#xff1f; “各位大神&#xff0c;怎么恢复回收站里清空的文件&#xff1f;我按照百度上的方法&#xff0c;还是不行。” 当你在电脑上删除文件时&#xff0c;它们通常会被移到回收站&#xf…

mpi4py 运行过程中出现Read -1, expected xxx, errno = 1 解决方案

目录 问题描述 代码1&#xff08;串行&#xff09; 代码2&#xff08;并行&#xff09; 代码2执行时所用指令 错误信息 解决方案 解决方案1 解决方案2 问题描述 今天正在学习使用mpi4py&#xff0c;在对比运行以下2个代码时疯狂报错&#xff1a; 代码1&#xff08;串…

HTML 脚本

HTML 脚本 JavaScript 是可插入 HTML 页面的编程代码。 JavaScript 使 HTML 页面具有更强的动态和交互性。 JavaScript 插入 HTML 页面后&#xff0c;可由所有的现代浏览器执行。 在线实例 插入一段脚本 如何将脚本插入 HTML 文档。 使用 <noscript> 标签 如何应对不…

非接触式流量监测设备——雷达流速仪

一、设备概述 雷达流速仪是一款非接触且可连续测量流速、水位、流量的一体式流量监测设备。它采用雷达平面微波技术&#xff0c;通过非接触方式测量水体的流速和水位。根据内置的软件算法&#xff0c;计算并输出实时断面流量及累计流量&#xff1b;可用于泵站、河道、灌渠、地…