C语言(CED)有排成一行的n个方格,用红(Red)、粉(Pink)、绿(Green)三色涂每个格子,每格涂一色,要求任何相邻的方格不能同色,且首尾两格也不同色.求全部的满足要求的涂法.

相信大家在高中数学课上都做过类似于涂色的排列组合问题,那么这个问题如何用程序语言——C语言解决呢?

一、总体思路(如果你只是需要代码,请直接看代码部分)

你应该重视思路,用C语言将之前数学课上的思路重现一下就好了!这些问题都可以归类到递归问题,因为每次涂色的时候考虑的情况大致类似,下面提供一种思考方式:为方便起见,假设我已获得了求解这道问题的函数solve(),只要输入n是多少就能得到结果。

我们先不管第一格到第三格怎么涂色,我们先考虑倒数第2格,也就是第n-1格怎么涂色?

根据题意,

A、如果这个方格的颜色和第一个方格的颜色不同,那么第n个方格就只有1种选择(因为首尾两格也不同色),所以之前n-1个方格的涂色方法为solve(n-1),此时n个方格的涂色方法总数为solve(n-1)*1;(将第n个方格和之前的方格分成两部分)

B、如果这个方格的颜色和第一个方格的颜色相同,那么第n个方格就有2种选择,所以之前n-1个方格的涂色方法为solve(n-2)(为什么是n-2呢?是因为前提是?——“n-1的方格颜色已与第1个方格的颜色一致,第1个是什么颜色,第n-1方格就是什么颜色”,所以n-1方格的颜色不需要考虑,所以函数里传的参数是n-2)。所以,在本情况下,n个方格的涂色方法总数为2*solve(n-2)

上述的A、B是思考方式上的分类,说白了就是初中数学(中考最后一题)中要掌握的分类讨论思想---“要想解对题,此题的所有情况都要列出”,而不是我们C语言中,不是if就是else的互斥情况

综上,解决涂色问题的表达式是:方法总数=solve(n-1)*1+2*solve(n-2);说到这,你也许就觉得懂了,但是你忘了,我们的这个函数是假设出来的,还没有实现呢!别着急,请看第二部分,实现过程。

二、实现过程(“如果你不思考的Copy,你将永远是layman!”)

我们可以发现,当n<=3时,上述的思路行不通,所以可以先用递推式来模拟一下简单的涂色,n=1、n=2、n=3的情况。

发现:A:n=1时,涂色方法总数=3;//根据高中数学的排列组合得来的,下同

           B:n=2时,涂色方法总数=6(3*2)

               n=3时,涂色方法总数=6(3*2*1)

           C:n>=4时,涂色方法总数=solve(n-1)*1+2*solve(n-2)

根据上述A、B、C三种情况,我们写下如下的代码:这里用long是为了范围更大,因为要大数输出!

#include <iostream>
#include <cmath>
using namespace std;
long long solve(int n) //用long long定义,整形范围更大。
{long long a[3]= {0};a[0]=3;//根据之前高中数学所学内容得出当n=1时,方法数为3;a[1]=6;//与上同理a[2]=6;//与上同理if(n==1)return 3;else if(n==2||n==3)return 6;elsereturn solve(n-1)*1+2*solve(n-2);
}
int main()
{int n;cout << "请输入方格的个数:" << endl;while (cin >> n){//输入方格数if (n == 0){cout << "输入有误!请重新输入方个个数:" << endl;continue;}cout << "对应的涂色方法为:" << endl;cout << solve(n) << endl;cout << "涂色已完成" << endl;cout << "请输入下一方格的个数:(无其它输入请用EOF结束程序)" << endl;}return 0;
}

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

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

相关文章

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

又涉及到递归问题&#xff0c;这道题的大致内容是这样的&#xff1a; &#xff08;请用递推方式求解&#xff09;对于一个2行N列的走道。现在用1*2,2*2的砖去铺满。问有多少种不同的方式。下图是一个2行17列的走道的某种铺法。 提示&#xff1a;观察前n个结果&#xff0c;可以…

C语言(CED)王老师爬楼梯,他可以每次走1级或者2级,输入楼梯的级数,求不同的走法数(递归求解)

&#xff08;请先看置顶博文&#xff09;本博打开方式&#xff0c;请详读_liO_Oil的博客-CSDN博客_怎么把androidstudio卸载干净 题目大意&#xff1a;王老师爬楼梯&#xff0c;他可以每次走1级或者2级&#xff0c;输入楼梯的级数&#xff0c;求不同的走法数。例如&#xff1a;…

C语言(CED)查找最接近的元素(分治法/二分查找):在一个非降序列中,查找与给定值最接近的元素。(递归实现)

&#xff08;请先看置顶博文&#xff09;本博打开方式&#xff0c;请详读_liO_Oil的博客-CSDN博客_怎么把androidstudio卸载干净 一、题目大意 查找最接近的元素&#xff08;分治法/二分查找&#xff09;&#xff1a;在一个非降序列中&#xff0c;查找与给定值最接近的元素。…

C语言(CED)输出前k大的数(分治法/局部快速排序):给定一个数组,统计前k大的数并且把这k个数从大到小输出。

)输出前k大的数&#xff08;分治法/局部快速排序&#xff09;:给定一个数组&#xff0c;统计前k大的数并且把这k个数从大到小输出。 [输入] 第一行包含一个整数n&#xff0c;表示数组的大小。 第二行包含n个整数&#xff0c;表示数组的元素&#xff0c;整数之间以一个空格分…

C语言(CED)最长公共子序列----动态规划第一题

一、动态规划算法与分治法的异同 相同点&#xff1a; A、二者均是将待求解的问题分成若干子问题来求解。 B、二者在编写代码的时候&#xff0c;都要用到递归。 不同点&#xff1a; A、分治法求解的问题&#xff0c;在将问题分成若干子问题之后&#xff0c;其子问…

C语言(CED)01背包——动态规划第二题

一、问题描述 给定n种物品和一个背包。物品i的质量Wi&#xff0c;其价值Vi&#xff0c;背包的容量为c。问如何选择装入背包中的物品&#xff0c;使得装入背包中的物品总价值最大&#xff1f; 二、解题思想 01背包和最长公共子序列都是动态规划题目中求最优解的问题&#xff0…

C语言(CED)gameboy接馅饼问题

一、题目大意 都说天上不会掉馅饼&#xff0c;但有一天gameboy正走在回家的小径上&#xff0c;忽然天上掉下大把大把的馅饼。这馅饼别处都不掉&#xff0c;就掉落在他身旁的10米范围内。馅饼如果掉在了地上当然就不能吃了&#xff0c;所以gameboy马上卸下身上的背包去接。但由…

C语言(CED)递归实现汉诺塔问题

一、问题大意 大梵天创造世界的时候做了三根金刚石柱子&#xff0c;在一根柱子上从下往上按照大小顺序摞着64片黄金圆盘。大梵天命令婆罗门把圆盘从下面开始按大小顺序重新摆放在另一根柱子上。并且规定&#xff0c;任何时候&#xff0c;在小圆盘上都不能放大圆盘&#xff0c;…

C语言(CED)智力大冲浪——贪心算法第一题

一、题目大意 小伟报名参加中央电视台的智力大冲浪节目&#xff0c;本次挑战赛吸引了众多参赛者&#xff0c;主持人为了表彰大家的勇气&#xff0c;先奖励每个参赛者m元。先不要太高兴&#xff01;因为这些钱还不一定都是你的&#xff01;接下来主持人宣布了比赛规则&#xff…

C语言(CED)钢条最优切割收益

目录 一、题目大意 二、大致思路 三、具体实现 一、题目大意 一家公司购买长钢条&#xff0c;将其切割成短钢条出售&#xff0c;切割本身没有成本&#xff0c;长度为i的短钢条的价格为Pi。那给定一段长度为n的钢条和一个价格表Pi,求钢条的切割方案使得收益Rn最大。提示&…

撰写paper时,如何在word里输入图片或其他文献(PDF)里的公式?(更新时间2022.03.01)

我们在写paper时&#xff0c;经常会遇到在Word里编写数学公式的问题&#xff0c;其中大多数公式是已经存在的&#xff0c;所以只需要识别、复制、粘贴即可&#xff0c;那么接下来&#xff0c;我就介绍一下“Mathtype”“Mathpix”的方法&#xff0c;分为所需软件、软件操作、公…

家里接入某运营商300M宽带,为何网速还是很慢?(还未装修房屋的请进来)

&#xff08;请先看置顶博文&#xff09;本博打开方式&#xff0c;请详读_liO_Oil的博客-CSDN博客_怎么把androidstudio卸载干净 引言&#xff1a;家里接入300M的宽带&#xff0c;但是自我感觉网速不佳&#xff0c;遂结合所学知识&#xff0c;对此问题进行分析、研究和调察&…

(CED)列指针与行指针的联系与区别

一、列指针&#xff08;竖为列&#xff09; 1、列指针相关定义 列指针&#xff1a;被称为是指针变量指向二维数组的某个元素 一般使用时会有如下定义&#xff1a; int a[3][4]{1,2,3,4,5,6,7,8,9,10,11,12}; int *p;而上述代码定义的指针p&#xff0c;一般按照下表方式指向…

一、Pytho第一课——Python安装及配置路径方法(最详细小白教程,没有之一。如若不懂,不是还可以私信嘛!对吧?)

目录 一、下载软件 二、安装 三、编辑器 四、在Pycharm上成功运行Python程序&#xff08;配置Python解释器&#xff09; 一、下载软件 官方下载地址&#xff1a;https://www.python.org/downloads/&#xff08;打开似乎很吃力&#xff0c;必要时刻“挂灯”&#xff09; …

二、Python第二课——变量命名规则及字符串变量相关函数

目录 一、变量命名规则 二、字符串变量及相关函数 1、字符串变量 2、相关函数 最后琐碎杂物&#xff1a; 1、字符串之间的拼接 2、字符串格式控制&#xff08;制表符和换行&#xff09; 一、变量命名规则 正如其他编程语言一样&#xff0c;程序离不开声明变量&#x…

三、Python第三课——Python中数字的用法及编码原则(Python禅意)

目录 一、Python中的数字 1、整数 2、浮点数 3、整数、浮点数和字符串的联系和区别 二、编码原则 1、为代码增加注释 2、Python 禅意 A、编码精美 B、避繁就简 C、无简就繁 D、使用常规方法解决问题 E、先有效、再精巧、逐步升华 一、Python中的数字 编程中&#…

四、Python第四课——Python中列表及其操作(增删改查)

目录 一、Python中的列表 1、列表的定义和赋值 2、列表的使用 二、列表的“增删改查” 1、列表中元素的增加 A、在列表尾添加元素 B、在列表中插入元素 2、列表中“元素的删除” A、使用del语句删除元素 B、使用pop()函数删除元素 C、弹出列表中任何位置元素…

五、Python第五课——Python中组织列表的相关函数

目录 一、用sort()函数对列表进行永久排序 二、用sorted()函数对列表进行临时排序 三、用reverse()函数对列表进行列表原始排序的逆序输出 四、使用len()函数确定列表长度 创建列表后&#xff0c;内部的元素逐渐增多&#xff0c;其排列顺序也是无法预测的&#xff0c;因为…

如何正确下载、安装Codeblocks?

目录 一、Codeblocks的下载 二、Codeblocks的安装 三、Codeblocks的运行 相信很多同学在初学C语言时都会选择一个短小精悍的代码编辑器&#xff0c;如CodeBlocks&#xff08;不说别的了&#xff0c;直接切入正题&#xff09;。 在2020年&#xff08;今年&#xff09;3月份-…

Python:创建列表,其中包含数字1-1000000,为什么Pycharm控制台结果显示不完整?

目录 一、问题描述&#xff08;寻找解决方法的同学直接看“标题二”&#xff09; 二、解决办法 一、问题描述&#xff08;寻找解决方法的同学直接看“标题二”&#xff09; 在学习Python过程中遇到一个这样的问题&#xff0c;也算是一个小BUG吧。题目大意是这样的&#xff…