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 在主线程开线程_Python开启线程,在函数中开线程的实例
  2. JavaScript原型与原型链(总结篇)
  3. 为什么大数据需要数据湖?
  4. linux命令的详情描述,linux 常用基础命令 tail 详细介绍
  5. Maven 仓库使用与私有仓库搭建
  6. AcWing 1058. 股票买卖 V
  7. 微调︱caffe中fine-tuning模型三重天(函数详解、框架简述)+微调技巧
  8. Java并发编程中锁的正确使用方法
  9. python对象与json字符串的相互转化
  10. 宽带伤不起:大学教授称内地宽带费为香港400倍
  11. Java程序设计实验三 面向接口编程
  12. java代码合成多张图片成一张
  13. 树莓派linux负载均衡集群,在树莓派2上Nginx并发1W到底有多难
  14. const char* std::string CString 之间的转换
  15. 强迫性皮肤剥离征 Dermatillomania( skin picking disorder ):强迫性皮肤剥离症 论文
  16. 蓝桥杯单片机(十一)PCF8591(A/D转换)
  17. C++类和C结构体类型的异同
  18. chromedriver与GOOGLE浏览器对应版本
  19. 01.Polsarpro软件介绍
  20. Python 汽车之家 车型销量--参数分析与实现

热门文章

  1. 学习生信的系列教程 | 留言您是如何学习生信的免费获取北大出版《Python数据分析》书籍...
  2. Hemberg-lab单细胞转录组数据分析(四)
  3. Mac截图高端操作,这些技巧你绝对不知道!
  4. 32销售是合理的引导用户购买
  5. sqlsession.selectlist 会返回null么_如何在Java代码中去掉烦人的“!=null”
  6. python爬虫利器p_Python爬虫利器五之Selenium的用法
  7. HTTP笔记-SOAP基本概念
  8. Spring Boot笔记-get请求发送json数据(方便前端vue解析)
  9. Spring Boot中@ConfigurationProperties与@PropertySource的基本使用(读取指定的properties文件)
  10. Linux学习笔记-匿名和命名管道读写的相同点及不同点