数组积木问题 c语言,全排列算法及解决数字搭积木问题

article/2025/10/7 11:12:48

如果你是做这道题不会,那么你可以看这道题的解题思路,如果你是不太理解全排列算法,那么你可以通过这个题来理解。

题目描述:

小明最近喜欢搭数字积木。一共有10块积木,每个积木上有一个数字,0~9。

搭积木规则:

每个积木放到其它两个积木的上面,并且一定比下面的两个积木数字小。

最后搭成4层的金字塔形,必须用完所有的积木。

下面是两种合格的搭法:

e30006b82df7301a17ca0066228f0074.png

请你计算这样的搭法一共有多少种?

分析

一共有10个数字,要我们把所有可行的排列方式都求出来,一时没什么思路,索性就全排列了,把所有排列的情况都求出来,然后在把每种情况都判断一下,是不是就可以得到答案了。

所以全排列怎么写成了第一大问题了。

全排列

对于这个问题来说,我们把金字塔当成一个int数组,那么就为 全排列这个数组{0,1,2,3,4,5,6,7,8,9}。

太长了,想不明白呀,所以来看比较少的呗。

对于{0,1}全排列,就是把0抽出来,1做全排列,再把1抽出来,0做全排列,对于{0,1,2},就是:把0抽出来,把1,2做全排列,

把1抽出来,把0,2做全排列,

把2抽出来,把0,1做全排列。

接下来那不就和上面那个{0,1}一样了吗?

这是不是个递归呢?很明显吧。的确是。

那好我们定义一个方法,这个方法的作用是,把list数组全排列,而参数curr表示当前抽出来的那个数,就像上面例子提到的0一样。

提出来了之后呢,是不是要把curr交换了,这样就可以把所有在这个位置上的所有情况列出来了,所以使用一个for循环,来交换curr和后面剩余数组的数(就是上面例子的1,2,3步骤)。

所以紧接着定义一个方法,交换两数swap(list,curr,j);,当然你也可以把这个方法直接写到这个函数里面,但是毕竟不美观,不实用。

重点来了:回溯!!!

从这张图中,所谓回溯就是要回到上一没有操作过的状态,再去考虑别的情况。就下面这个A,B,C他需要回到上一次抽数出来之前的状态。这样他才能去抽另外一个数,全排列下一种情况。所以我们再写一遍swap(list,curr,j);,把它原来的状态恢复就行了嘛。

02eb6d69a7192bdb8ba824e5f96c1f6e.png

问题分析到这了,我们的代码基本上就可以出来了,所以看下代码,如果看不懂在回到我的分析,相信你一定能看懂。public class Test2 {

static int sum ;

public static void main(String[] args) {

int list[] = {0,1,2,3,4,5,6,7,8,9};

allSort(list,0);

System.out.println(sum);

}

//代表将第a[m]和a[n]相交换

public static void swap(int a[],int m ,int n){

int temp = a[m];

a[m] = a[n];

a[n] = temp;

}

//调用全排列数组list,curr代表当前放在第一个的为第几个数字,比如开始就为数组第0个数字

public static void allSort(int list[],int curr ){

//如果当前数组的索引等于数组的长了,就将方法加1

if (curr == list.length-1){

check(list);

}else {

for (int j = curr; j < list.length; j++){

swap(list,curr,j);//交换当前抽出来那个数

allSort(list,curr+1);

swap(list,curr,j);//回溯

}

}

}

public static void check(int list[]){

if (list[1] < list[0]) return;

if (list[2] < list[0]) return;

if (list[3] < list[1]) return;

if (list[4] < list[1]) return;

if (list[4] < list[2]) return;

if (list[5] < list[2]) return;

if (list[6] < list[3]) return;

if (list[7] < list[3]) return;

if (list[7] < list[4]) return;

if (list[8] < list[4]) return;

if (list[8] < list[5]) return;

if (list[9] < list[5]) return;

sum++;

}

}

其实这个全排列都可以当成一个模板了,但是还是推荐大家一定要手敲,自己写代码,写出来了,才是自己的东西。


http://chatgpt.dhexx.cn/article/7v4uX46O.shtml

相关文章

Vue实现图形化积木式编程(一)

Babylon.js基础场景搭建 路由前言最终实现效果本文实现效果技术选型1.前端2.后端 完整代码代码分解0.npm安装相关依赖1.引入模块2.场景初始化3.ArcRotateCamera 相机初始化4.灯光初始化5.地面初始化5-1. 绿地5-2.网格地面 6.正方体物体初始化7.天空盒初始化 后续计划Babylon.js…

Vue实现图形化积木式编程(十二)

执行Blockly生成代码 路由下一篇历史回顾Babylon.js部分Blockly部分 前言最终实现效果本文内容实现思路问题分析问题原因不优雅解决优雅解决 完整代码 后续计划开源项目GitHub链接资源下载链接你的点赞是我继续编写的动力 路由 下一篇 Vue实现图形化积木式编程(十三) ---- 步…

Vue实现图形化积木式编程(二)

Babylon.js加载模型到场景中 路由下一篇历史回顾 前言最终实现效果本文实现效果完整代码操作分解&#xff08;Babylon.js模型格式转换与导入&#xff09;0.在开源模型网上下载一个模型/自己制作一个1.转换为.babylon文件2.将模型文件放在服务器上方案一&#xff08;最新发现的方…

python积木式编程_TurnipBit—MicroPython开发板:从积木式编程语言开始学作小小创客...

编程、建模、制做动画和游戏……这些当初咱们默认只有成年人玩得转的事情,如今早已经被无数小孩子给颠覆甚至玩出新境界了。热爱科技和动手的“创客”(Maker)如今在全世界都煊赫一时。今年以来,对青少年的创客教育在中国不管是庙堂仍是大众而言亦是热门话题。编程 从TurnipBi…

c++手机编程软件_积木编程软件手机版下载-积木编程软件下载v1.0.1 安卓版

积木编程软件是可以在线可以学习编程的软件,平台给用户提供了大量的编程学习教程&#xff0c;软件还支持在线编程&#xff0c;学习内容丰富&#xff0c;让用户学习起来不会枯燥乏味&#xff0c;就算你是零基础的小白&#xff0c;也可以体验到编程的乐趣。 积木编程官方简介 积木…

Vue实现图形化积木式编程(十三)

步骤运行代码块高亮 路由历史回顾Babylon.js部分Blockly部分 前言最终实现效果本文内容实现1. 安装依赖2. 简化语法3. 引入js解析器4. 运行代码5. 加入高亮 完整代码本文章的用例代码已经同步到github上&#xff0c;运行程序后访问链接即可查看效果: [http://localhost:3000/#/…

搭积木php编程,Primo Toys,一款可以同时搭积木与编程的玩具

原标题&#xff1a;Primo Toys,一款可以同时搭积木与编程的玩具 时下社会&#xff0c;“编程”一词早已不是成人世界的一个职业&#xff0c;如今&#xff0c;编程能力就像蜗牛日常的读写一样&#xff0c;渗透到孩子生活的方方面面&#xff0c;不论是APP&#xff0c;游戏&#x…

python的积木式编程

edu.codemao.cn https://wood.codemao.cn/ https://static.codemao.cn/wood_docs/web/code/Control.html 编程猫和scratch大同小异&#xff0c;和其他Python平台相比较&#xff1a; 优势&#xff1a; 支持硬件编程丰富的Python库积木/代码一键转换搭积木 学编程使用方便&a…

c语言的积木编程,c语言入门第3节,掌握它就能随心所欲的编程了,自己造积木...

前面两节介绍了如何快速搭建 C 语言开发学习环境&#xff0c;并且给出并解释了 hello world 的代码。上一节介绍了C语言的函数&#xff0c;应该注意到&#xff0c;到目前为止&#xff0c;我们使用的函数都是现有的系统函数(例如 printf&#xff0c;sin 等函数)。事实上&#xf…

等边三角形的积木编程

用Scratch里的画笔&#xff0c;可以很方便的画出等边三角形。步骤如下&#xff1a; 1、定义"等边三角形"积木 点击Scratch里的"自制积木" --》制作新的积木 --》直线 --》添加4个参数&#xff0c;如图(1)、(2)所示&#xff1a; 图(1) 定义"等边三角…

积木编程软件

当然这种观点是很荒谬的&#xff0c;不会编程不等于文盲。虽然大多数父母都有文化和读写能力&#xff0c;但是大多数父母都不是程序员&#xff0c;也不知道程序员需要什么样的技能。格物斯坦认为&#xff1a;针对孩子们的编程书籍给出的都是一些问题的“标准”答案。如果你的孩…

金字塔的积木编程

金字塔是一个上尖下方的四面体&#xff0c;它的截面是一个三角形&#xff0c;可以用长方形的砖块去堆叠成一个大的三角形来表示金字塔。     下面介绍使用Scratch来画金字塔。 1、定义"砖块"积木 图(1) 定义"砖块"积木 图(2) "砖块"积木代码 …

OpenBlock Desktop v2.3.1积木编程

最新版 2.3.1 Release OpenBlock Desktop v2.3.1 openblockcc/openblock-desktop GitHubhttps://github.com/openblockcc/openblock-desktop/releases/tag/v2.3.1 新功能 用户可以在串口终端中使用回车键发送数据。提高 esp32/8266 的默认上传波特率以提高上传速度。删除 es…

python积木编程软件_积木编程软件手机版下载

积木编程软件是可以在线可以学习编程的软件,平台给用户提供了大量的编程学习教程&#xff0c;软件还支持在线编程&#xff0c;学习内容丰富&#xff0c;让用户学习起来不会枯燥乏味&#xff0c;就算你是零基础的小白&#xff0c;也可以体验到编程的乐趣。 积木编程官方简介 积木…

零代码积木编程案例分享

和大家分享一个通过积木编程技术实现的复杂业务系统的案例&#xff0c;主要比较传统有代码和零代码积木编程在项目各个阶段的人力投入和成本比较。 客户是一家工业丝线工厂&#xff0c;期望实现生产、仓库、设备的管理&#xff0c;同时连线近百台设备&#xff0c;还要集成AGV、…

时钟的积木编程

家里壁挂的时钟滴答滴答响着&#xff0c;里面有时针、分钟和秒针。在时钟刻度盘里&#xff0c;秒针每60秒走完一周&#xff0c;即秒针的最小角度为360/60 6&#xff1b;分针每60分钟走完一周&#xff0c;即分针的最小角度为360/60 6&#xff1b;时针每12小时&#xff0c;走完一…

长方形的积木编程

用Scratch画长方形有多种方法&#xff0c;可以用一个“点长宽”来画&#xff0c;也可以使用"长方形的2个对角顶点来画"&#xff0c;还可以使用"长翻转90宽翻转90来画"。 1、"点长宽"方式 1.1 定义"直线"积木 点击Scratch左侧的&quo…

Netsparker介绍

Netsparker是一款综合型的web应用安全漏洞扫描工具&#xff0c;它分为专业版和免费版&#xff0c;免费版的功能也比较强大。Netsparker与其他综合性的web应用安全扫描工具相比的一个特点是它能够更好的检测SQL Injection和 Cross-site Scripting类型的安全漏洞。‍‍ 转载于:ht…

使用Netsparker扫描及**某站点

1.1使用Netsparker扫描及某站点 目前市面上漏洞扫描软件有多款,前面介绍了一些扫描软件例如awvs对目标站点进行扫描,其实国外还有一款扫描软件Netsparker也挺厉害,扫描误报率低,扫描效果还不错。在本文中,对一个目标站点进行扫描,并未发现高危漏洞,但通过列目录漏洞…

开源的网络监控工具:Sniffnet,简单而有趣!

在当今数字化的世界中&#xff0c;网络监控工具对于管理和保护网络的安全至关重要。网络管理员和安全专业人员需要一种高效且易于使用的工具&#xff0c;以监视和分析网络流量&#xff0c;识别潜在的安全威胁和性能问题。Sniffnet 是一个开源的网络监控工具&#xff0c;它提供了…