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

题目描述:

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

搭积木规则:

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

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

下面是两种合格的搭法:

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

分析

一共有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);,把它原来的状态恢复就行了嘛。

问题分析到这了,我们的代码基本上就可以出来了,所以看下代码,如果看不懂在回到我的分析,相信你一定能看懂。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++;

}

}

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

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

  1. 详讲全排列算法,及解决数字搭积木问题

    如果你是做这道题不会,那么你可以看这道题的解题思路,如果你是不太理解全排列算法,那么你可以通过这个题来理解. 题目描述: 小明最近喜欢搭数字积木.一共有10块积木,每个积木上有一个数字,0~9. 搭积 ...

  2. c语言全排列算法_一文学会回溯搜索算法解题技巧

    点击上方蓝字设为星标 下面开始今天的学习- 本文向大家介绍了回溯算法的基础知识,以帮助大家更好地理解回溯算法. 回溯搜索算法简介 维基百科中关于回溯算法的介绍是: 回溯算法(backtracking) ...

  3. SAP那些事-职业篇-26-企业信息化:从拼图到搭积木

    所有文章在公众号"MZ信息化咨询杂谈"同步更新,习惯公众号阅读的朋友可直接关注公众号哦. 今天在网上看到一个说法,说以前呢,我们学习有点像拼图,每个学科,每一种学问都已经是一张画好 ...

  4. [通用技术]在不同语言中用协程实现全排列算法(C++/Lua/Python/C#)

    我这里实现全排列的基本算法如下(C++): 1 #include <algorithm> 2 #include <iostream> 3 #include <vector ...

  5. 全排列算法(C语言)

    全排列算法(C语言) 思路 图形理解 树结构 代码 思路 图形理解 我看先看一下从1–4的全排列,如下: (1)就整体排列而言可以分为四组,分别是以1打头的,以2打头的,以3打头的,以4打头的. (2 ...

  6. C语言全排列递归算法理解,C#算法之全排列递归算法实例讲解

    排列:从n个元素中任取m个元素,并按照一定的顺序进行排列,称为排列: 全排列:当n==m时,称为全排列: 比如:集合{ 1,2,3}的全排列为: { 1 2 3} { 1 3 2 } { 2 1 3 ...

  7. c语言实现在数组中找一个数字显示,C语言找出数组中的特定元素的算法解析

    问题描述:一个int数组,里面数据无任何限制,要求求出所有这样的数a[i],其左边的数都小于等于它,右边的数都大于等于它.能否只用一个额外数组和少量其它空间实现. 思路:如果能用两个辅助数组,那么相对 ...

  8. 【转】全排列算法非递归实现和递归实现

    来源:http://blog.csdn.net/e3399/article/details/7543861 (一)递归的全排列算法 (A.B.C.D)的全排列为 1.A后面跟(B.C.D)的全排列 2 ...

  9. 全排列的java算法_全排列算法原理和实现

    评论 # re: 全排列算法原理和实现  回复  更多评论 #include #include #define CHESSNUM 9 using namespace std; /*********** ...

最新文章

  1. 2020年高等数学方法与提高(上海理工大学)学习笔记:常微分方程
  2. 数据库事务的隔离级别简单总结
  3. 贵州大学计算机专业的导师是谁,贵州大学计算机科学与信息学院导师介绍:王以松...
  4. 把转变为json_如何使用7行JSON将您的网站转变为移动应用程序
  5. E: Sub-process /usr/bin/dpkg returned an error code (1)解决办法
  6. [oc学习日记]代理模式
  7. python实现文件重命名_基于python实现复制文件并重命名
  8. python学习_循环结构 and 类型判断
  9. OpenCV-图像处理(23、直方图均衡化)
  10. foremost的下载安装使用说明
  11. BeanUtils与PropertyUtils区别
  12. (转载)0201 0402 0603 0805 1206焊盘封装尺寸
  13. 【Matlab综合设计】开环Buck-Boost升压-降压式变换器Simulink仿真(含仿真模块选择和参数计算过程)
  14. C语言指数函数应用pow n次方
  15. CBS paper防伪安全纸
  16. HTML 直播 RTMP流实时播放
  17. sql-lab 通关Less1 -65(深入学习)
  18. 零基础学习笔记 - ADF4159
  19. 金山毒霸技术预览版1.0 beta【云沙箱 三引擎】发布(毒霸体验团队可优先测试)...
  20. 七麦js破解,python爬取app榜单

热门文章

  1. 适合小白的网络安全书籍推荐
  2. 【财经期刊FM-Radio|2021年01月20日】
  3. ccc-Classification-李宏毅(4)
  4. CSS学习中|关于背景图片background
  5. 行优先和列优先存储高维数组
  6. 线程池包含哪些状态?
  7. matlab 编程之代码规范
  8. ts 数组转换对象 对象转换数组的公共方法
  9. 手把手教你如何使用网页翻译插件看懂英文文献
  10. PS如何给人物照片添加烟雾效果