又涉及到递归问题,这道题的大致内容是这样的:

(请用递推方式求解)对于一个2行N列的走道。现在用1*2,2*2的砖去铺满。问有多少种不同的方式。下图是一个2行17列的走道的某种铺法。

提示:观察前n个结果,可以得到递推式子;如果N很大,需要高精度计算。

其实这道题,与之前的方格涂色问题很像,说它像不仅因为在思考方式上很像,在最后的代码上也很想像,听我一一道来。

题目提示,先观察前n个结果得到递推式。那我们就把前n个结果列出来。在列的同时,就有一种这样的感觉——就像是在高中化学中写同分异构式,“有序思考”。在这里我就不展示我在草稿纸上列举的了直接说思想。

一、主要思想

和讲解方格涂色问题一样,我先来讲一下我的思路:

每次铺砖时考虑的情况大致类似,所以可以用递归求解。根据最后剩余的列数,我们将本问题分成两种情况:

A:最后剩余一列,那么假设把这列去掉后,其铺砖情况与n-1时的情况一样,而加上后,也只有一种情况所以方法数位pave(n-1)

B:最后剩余两列,那么把这两列先去掉后和n-2的情况一样,加上这两列后一共有三种情况:1*2竖着放2列,1*2横着放,2*2直接填满。因为1*2竖着放和A情况重复,所以方法数为pave(n-2)*2

综上:方法总数=pave(n-1)+2*pave(n-2)

二、具体实现

思路有了,但是其中的pave()函数还没有,这就需要我们动手来操作了。以下是具体实现的代码,如果看过我之前那篇博文的同学可能就会知道,这不是一样的问题嘛!对的,代码几乎一样。

#include<iostream>
using namespace std;
long long pave(int n)
{long long c[3] = { 0 };//保存不使用2*2砖的方法次数c[0] = 1;//由数学逻辑推出c[1] = 3;//同上c[2] = 5;//同上if (n == 1)return 1;else if (n == 2)return 3;else if (n == 3)return 5;elsereturn pave(n - 1) + 2 * pave(n - 2);//用递归求解
}
int main()
{int n;cout << "请输入走道的列数N" << endl;while (cin >> n){if (n == 0){cout << "输入有误,请重新输入!" << endl;continue;}cout << "对应的铺法有:" << endl;cout << pave(n) << endl;cout << "铺砖已完成" << endl;cout << "请输入下一走道的列数:(无其他输入请按EOF结束)" << endl;}return 0;
}

C语言(CED)对于一个2行N列的走道。现在用1*2,2*2的砖去铺满。问有多少种不同的方式(递归求解)相关推荐

  1. C语言试题二十三之编写一个函数void function(int tt[m][n],int pp[n]),tt指向一个m行n列的二维函数组,求出二维函数组每列中最小元素,并依次放入pp所指定一维数组中

    1. 题目 请编写一个函数void function(int tt[m][n],int pp[n]),tt指向一个m行n列的二维函数组,求出二维函数组每列中最小元素,并依次放入pp所指定一维数组中.二 ...

  2. R语言使用diag函数生成一个N行N列的单位矩阵

    R语言使用diag函数生成一个N行N列的单位矩阵 目录 R语言使用diag函数生成一个N行N列的单位矩阵 R语言是解决什么问题的? R语言使用diag函数生成一个N行N列的单位矩阵 安利一个R语言的优 ...

  3. C语言 输入一个5行5列的数组。1.求数组主对角线上元素的和。2.求出辅对角线上元素的积。3.找出主对角线上最大的值及其位置

    C语言 输入一个5行5列的数组.1.求数组主对角线上元素的和.2.求出辅对角线上元素的积.3.找出主对角线上最大的值及其位置 主对角线是什么: 在一个n阶方阵(或是n阶行列式)中,从左上角到右下角这一 ...

  4. 用c语言手搓一个600行的类c语言解释器: 给编程初学者的解释器教程(1)- 目标和前言

    用c语言手搓一个600行的类c语言解释器: 给编程初学者的解释器教程(1)- 目标和前言 用c语言手搓一个600行的类c语言解释器: 给编程初学者的解释器教程(1)- 目标和前言 用c语言手搓一个60 ...

  5. C语言编程>第七周 ⑧ 请编一个函数void fun(int a[M][N],int b[N]),c指向一个M行N列的二维数组,求出二维数组每列中最大元素,并依次放入b所指一维数组中。

    例题:请编一个函数void fun(int a[M][N],int b[N]),c指向一个M行N列的二维数组,求出二维数组每列中最大元素,并依次放入b所指一维数组中.二维数组中的数己在主函数中赋予. ...

  6. m行n列最大值和最小值C语言,找数组最值 按如下函数原型编程从键盘输入一个m行n列的二维数...

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 找数组最值 按如下函数原型编程从键盘输入一个m行n列的二维数组,然后计算数组中元素的最大值及其所在的行列下标值.其中,m和n的值由用户键盘输入.已知m和n ...

  7. Algs4-1.1.13编写一段代码,打印出一个M行N列的二维数组的转置(交换行和列)

    1.1.13编写一段代码,打印出一个M行N列的二维数组的转置(交换行和列). public  class Test {     public static void main(String[] arg ...

  8. 13.请编一个函数void fun(int tt[M][N],int pp[N]),tt指向一个M行N列的二维数组,求出二维数组每列中最小元素,并依次放入pp所指一维数组中。

    13.请编一个函数void fun(int tt[M][N],int pp[N]),tt指向一个M行N列的二维数组,求出二维数组每列中最小元素,并依次放入pp所指一维数组中.二维数组中的数已在主函数中 ...

  9. 按如下函数原型编程从键盘输入一个m行n列的二维数组,然后计算数组中元素的最大值及其所在的行列下标值。其中,m和n的值由用户键盘输入。已知m和n的值都不超过10。

    题目:按如下函数原型编程从键盘输入一个m行n列的二维数组,然后计算数组中元素的最大值及其所在的行列下标值.其中,m和n的值由用户键盘输入.已知m和n的值都不超过10. void InputArray( ...

最新文章

  1. python字符编码是什么_python3字符编码是什么?怎么用?
  2. 使用Oracle中fileopen命令加载文件时遇到的怪问题(转)
  3. php arrayudiff,php array_udiff工作原理
  4. 核心编程之十一章的11-9
  5. js本页导出Excel,下载
  6. 面向对象的3个基本要素和5个基本设计原则(整理)
  7. 7-2 玩转二叉树 (25分)_2-1!72分钟绝杀!西乙黑马踢疯了,西班牙人+武磊却迎利好...
  8. unix grep命令_Linux / UNIX中的Grep命令
  9. can总线配置读入是什么意思_CAN总线(一)
  10. 李沐-动手学深度学习
  11. 学习版origin申请安装
  12. Android EditText 只能输入数字
  13. 三丁基-巯基膦烷「tBuBrettPhos Pd(allyl)」OTf),1798782-17-8
  14. 如何把小程序游戏运行到自有App中?(IOS篇)
  15. Java-对象转型(casting)
  16. python输入数据带单位_python – Pandas用单位插入数据
  17. Centos7安装(四)抓包工具wireshark源码编译安装
  18. SUSE12 LVM- Logical Volume Manager(逻辑卷管理)实例
  19. Flash鼠绘入门第八课:绘制脱俗荷花-Flash鼠绘脱俗荷花教程(6)
  20. 企业常用的微博营销方法有哪些呢?

热门文章

  1. springboot elasticsearch vue ik中文分词器 实现百度/京东全文搜索
  2. RabbitMQ 手动签收
  3. 工作流实战_04_flowable 流程的模板的图片和xml显示
  4. Sublime Test3 添加一键格式化XML文件插件
  5. linux php 添加gd,linux(centos)下为php添加添加GD扩展
  6. 找第一个只出现一次的字符_leetcode哈希表之第一个只出现一次的字符
  7. C语言 fclose 函数 - C语言零基础入门教程
  8. 数组:三种初始化及内存分析
  9. 教你前端input框只允许输入正整数
  10. BugkuCTF-MISC题random color