2018-3-18

1.递归的主要思路是:
n个数的全排列=(n-1个数的全排列)+(另一个数作为前缀)

#include<iostream>
using namespace std;const int N = 3;
int x[N+1]={1,2,3};void dfs(int step,int end){if (step==N){for (int i=0;i<N;i++){cout<<x[i]<<" ";}cout<<endl;return ;}for (int i=step;i<end;i++){int t=x[i];x[i]=x[step];x[step]=t;dfs(step+1,end);t=x[i];x[i]=x[step];x[step]=t;}
}int main(){dfs(0,N); return 0;
} 

2.若我们的序列里面有重复的数字呢?去重的全排列就是从第一个数字开始每个数和它后面非重复出现的数字交换。当然这里的重复出现的数字的最后一个会变成非重复的数字的,因而我们这里保证和相同的数字只交换一次。

#include<iostream>
using namespace std;const int N = 5;
int x[N+1]={1,2,3,2,1};bool res(int step,int end){for (int i=step+1;i<end;i++){if (x[i]==x[step]) return false;}return true;
}void dfs(int step,int end){if (step==N){for (int i=0;i<N;i++){cout<<x[i]<<" ";}cout<<endl;return ;}for (int i=step;i<end;i++){if (res(i,end)){int t=x[i];x[i]=x[step];x[step]=t;dfs(step+1,end);t=x[i];x[i]=x[step];x[step]=t;  }}
}int main(){dfs(0,N); return 0;
} 

3.非递归形式就需要我们找规律了…
下一个序列为从右往左找到第一个x[i]<x[i+1]的那个,然后再从右往左找到第一个比x[i]大的数x[j],两个数进行交换,交换过后将x[i]之后的所有数进行从小到大排序即可。
上一个序列为从右往左找到第一个x[i]&rt;x[i+1]的那个,然后再从右往左找到第一个比x[i]小的数x[j],两个数进行交换,交换过后将x[i]之后的所有数进行从大到小排序即可。

#include<iostream>
#include<algorithm>
using namespace std;const int N = 6;
int x[N+1]={9,2,6,5,2,0};void next_prime(){int i,j; for (i=N-2;i>=0;i--) {if (x[i]<x[i+1]){break;} } for (j=N-1;j>=0;j--){if (x[j]>x[i]){break;}}int t=x[j];x[j]=x[i];x[i]=t;sort(x+i+1,x+N);
}bool cmp(int a,int b){return a>b;
} void pre_prime(){int i,j; for (i=N-2;i>=0;i--) {if (x[i]>x[i+1]){break;} } for (j=N-1;j>=0;j--){if (x[j]<x[i]){break;}}int t=x[j];x[j]=x[i];x[i]=t;sort(x+i+1,x+N,cmp);
}void show(){for (int i=0;i<N;i++){cout<<x[i]; } cout<<endl;
}int main(){next_prime();show();pre_prime();show();return 0;
}

给一个题目吧!
搭积木:
一共有0到9共10个积木,每个积木都有一个数字0~9,每个积木放在两个积木上面,但是要满足比下面两个积木小,搭四层的积木,共有多少搭法。

方法一:
将其看作是一维的,利用全排列把所有情况都表示出来然后再进行判断,满足条件就将s+1。

#include<iostream>
using namespace std;const int N = 10;
int x[N+1]={0,1,2,3,4,5,6,7,8,9};
int s=0;bool res(){if (x[0]>x[1]||x[0]>x[2]) return false;if (x[1]>x[3]||x[1]>x[4]) return false;if (x[2]>x[4]||x[2]>x[5]) return false;if (x[3]>x[6]||x[3]>x[7]) return false;if (x[4]>x[7]||x[4]>x[8]) return false;if (x[5]>x[8]||x[5]>x[9]) return false;return true;
}void dfs(int step,int end){if (step==N){if (res()) s++;return ;}for (int i=step;i<end;i++){int t=x[i];x[i]=x[step];x[step]=t;dfs(step+1,end);t=x[i];x[i]=x[step];x[step]=t;}
}int main(){dfs(0,N); cout<<s<<endl;return 0;
} 

方法二:
将它看成二维的,逐行逐列进行查看,一旦发现x[c][r]<x[c-1][r-1]或者<x[c][r-1]就continue。

#include<iostream>
#include<cstring>
using namespace std;const int N = 10, M = 4;
bool f[N+1];
int x[N+1][N+1];
int sum=0;void dfs(int r, int c){if (r==M+1){sum++;return ;}if (c==r+1){dfs(r+1,1);return ;}for (int i=1;i<N;i++){if (i<x[r-1][c-1]||i<x[r-1][c]) continue;if (!f[i]){f[i]=true;x[r][c]=i;dfs(r,c+1);f[i]=false;}}
}int main(){memset(f,false,sizeof(f));dfs(2,1);cout<<sum<<endl;return 0;
} 

全排列的递归与非递归形式相关推荐

  1. 全排列(含递归和非递归的解法)

    全排列在近几年各大网络公司的笔试中出现的比较频繁 首先来看看题目是如何要求的(百度迅雷校招笔试题). 用C++写一个函数, 如 Foo(const char *str), 打印出 str 的全排列, ...

  2. 全排列(递归与非递归实现)

    全排列问题在公司笔试的时候非经常见,这里介绍其递归与非递归实现. 递归算法 1.算法简述 简单地说:就是第一个数分别以后面的数进行交换 E.g:E = (a , b , c),则 prem(E)= a ...

  3. 全排列递归与非递归python实现

    全排列就是,给定一个序列,列举出该序列中元素所有的排列情况,列举方法有递归和非递归两种,详细可以见这位大神写的博客:https://blog.csdn.net/jopus/article/detail ...

  4. 二叉树的遍历-递归与非递归 - 海子

    二叉树的遍历-递归与非递归 二叉树是一种非常重要的数据结构,很多其它数据结构都是基于二叉树的基础演变而来的.对于二叉树,有前序.中序以及后序三种遍历方法.因为树的定义本身就是递归定义,因此采用递归的方 ...

  5. C++实现二叉树 前、中、后序遍历(递归与非递归)非递归实现过程最简洁版本

    本文并非我所写,是复制的该链接中的内容: 最近学习二叉树,想编程实现递归和非递归的实现方式: 递归的方式就不说了,因为大家的递归程序都一样:但是对于非递归的实现方式, 根据这几天的查阅资料已看到差不多 ...

  6. n个元素的所有子集(递归+非递归 +不去重)

    一.非递归方法 思路分析:n个元素的子集共有2^n个,其中包括空集. (1)假设有3个元素{a, b, c},那么此时有 2^3 个子集,即8个子集. (2)因为有8个子集,而且包括空集,注意7对应的 ...

  7. 快速排序和归并排序中一趟的理解(递归和非递归)

    引:2019年408中数据结构一道考察快速排序的选择题 答案:D 定位:这道题在考察快速排序中一趟的概念.注意,基本的冒泡,插入,选择排序的一趟概念很容易理解, 接下来我们要讨论的是递归排序算法中(本 ...

  8. 二叉树的遍历(递归与非递归实现)

    二叉树的遍历(递归与非递归实现) 二叉树的实现(三叉链表的形式) public class XieChaoThreeLinkBinTree<E> {public static class ...

  9. 汉诺塔递归与非递归实现

    汉诺塔递归与非递归实现 背景介绍 汉诺塔(Tower of Hanoi),又称河内塔,是一个源于印度古老传说的益智玩具.大梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上按照大小顺序摞着64 ...

  10. 二叉树的前序、中序、后序遍历(递归、非递归写法)

    文章目录 一.什么是二叉树? 二.二叉树的基本概念 三.二叉树的三种遍历方式 1.前序遍历(preordertraversal) 1.中序遍历(inordertraversal) 1.后序遍历(pos ...

最新文章

  1. 官网PYthon语言参考手册The Python Language Reference
  2. 清除window 系统中的垃圾文件-转
  3. python查微信好友是否删除自己_Python + Appium 自动化操作微信查找自己是否被删除...
  4. python最优分箱计算iv值_GitHub - zhaoxingfeng/WOE: Weight of Evidence,基于iv值最大思想求最优分箱...
  5. 《论文笔记》Multi-UAV Collaborative Monocular SLAM
  6. power bi 实时_Power BI中的实时流
  7. Javascript实现完美继承
  8. java版本号分段比较_java比较版本号大小
  9. java 如何执行dig 命令_如何在cmd下直接执行Dig命令
  10. IP城域网域内组播功能测试
  11. 抓取网易云音乐歌曲热门评论生成词云
  12. 计算机配色与人工配色原则,计算机配色的理论与实践研究
  13. linux sox录音时间控制,SOX的一些命令和kaldi使用sox音频数据增强
  14. 追寻上古文明毕业季研学营
  15. 福利 | 区块链寒冬的“另类”火锅吃法
  16. 网络(八)之OSPF协议的原理及配置
  17. 2021 年 8 月全国程序员薪酬出炉:北京18904元位居榜首
  18. 【流媒体服务器Mediasoup】多人音视频架构、流媒体的比较、mediasoup介绍 (一)
  19. 怎么开传奇sf?传奇开服交流分享。
  20. 【Verilog】UART异步串口的verilog实现

热门文章

  1. “过午不食”实锤了!协和医院最新研究:每天6:00-15:00进食,其它时间不吃饭!...
  2. 生信分析和美图资源推荐!!!
  3. 眼液蛋白水平或许可预测阿尔茨海默症
  4. 学习生物信息的系列书籍
  5. AE对口型动画脚本插件Lipsyncr Mac
  6. 1.9 编程基础之顺序查找 01 查找特定的值 python AC
  7. mysql批量查询并替换或者更新某个字段
  8. 文件管理软件 云服务器,使用KDE Plasma文件管理器(Dolphin)连接到Linux上的服务器...
  9. 计算机网络-RIP与OSPF
  10. Java笔记-获取当前时间及对当前时间进行加减及时间对比