实验一:递归
创始人
2024-05-30 06:24:39
0

1.铺砖

题目描述:

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

输入要求:

一个整数N,N<=1000。

输出要求:

共有多少种铺法。

#include
using namespace std;
/*分为三种情况:1. 只剩一列,只有一种可能,返回 12. 只剩两列,有三种可能,两个 2*1 或一个 2*23. 大于等于3,进行递推,pave(n - 1) 代表使用 宽度为1的瓷砖,pave(n - 2)代表使用宽度为2的瓷砖,这种情况有三种可能,但是一种两个1*2竖着排列的可能已包含在1中,所以只剩下两种可能。 
*/
long long pave(int n)
{if (n == 1)return 1;//一个1*2else if (n == 2)//1*2 1*2 横竖各一种可能,2*2一种可能return 3;elsereturn 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)=(n−1)[D(n−2)+D(n−1)]

#include
using namespace std;
int Fun(int);
int main()
{int n,res;cin>>n;res=Fun(n);cout<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
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方格后+1int t = tile++,s = size/2;//左上、左下、右上、右下的顺序//tile:L型骨牌号/*步骤:1.判断特殊方格是否在此棋盘中1.1 不在棋盘中,根据当前方块在特殊方块的什么位置进行填充1.2 如果在目前棋盘中直接不需要填充,继续棋盘覆盖2.判断是否结束(size/2 == 1)2.1 是,结束2.2 否,返回 1*///覆盖左上角子棋盘if(dr//方格不在此棋盘中a[tr+s-1][tc+s-1]=t;//用t覆盖右下ChessBoard(tr,tc,tr+s-1,tc+s-1,s);//覆盖其余}//覆盖右上角子棋盘if(dr=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//方格不在此棋盘中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^kChessBoard(0, 0, x, y, pow(2,k));// 输出结果for(int i=0;ifor(int j=0;jprintf("%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);}
}

相关内容

热门资讯

前端-session、jwt 目录:   (1)session (2&#x...
linux入门---制作进度条 了解缓冲区 我们首先来看看下面的操作: 我们首先创建了一个文件并在这个文件里面添加了...
关于测试,我发现了哪些新大陆 关于测试 平常也只是听说过一些关于测试的术语,但并没有使用过测试工具。偶然看到编程老师...
前缀和与对数器与二分法 1. 前缀和 假设有一个数组,我们想大量频繁的去访问L到R这个区间的和,...
nodejs:本地安装nvm实... 一、背景-使用不同版本node的原因 vue3+ts、nuxt3版本,node...
JAVA集合知识整理 Java集合知识整理 HashMap相关 HashMap的底层数据结构:jdk1.8之...
无刷直流电机介绍及单片机控制实... 无刷直流电机介绍及单片机控制实例前言基本概念优势与劣势使用寿命基本结构使用单片机控制实例电子调速器&...
fwdiary(2) dp2 1.传纸条  AcWing 275. 传纸条 - AcWing 走两条路,走一条最大的...
常用的DOS命令 常用的DOS命令 DOS(Disk Operating System,磁...
<C++> 类和对象(下) 1.const成员函数将const修饰的“成员函数”称之为const成员函数,cons...