所谓N元错位排列,就是指对应于1,2,–,N的N元排列Im(m=1,2,—,N),满足Im!=m,算法的目的是构造出所有这样的错位排列,依据的基本思想是回溯法,在沿栈向下试探的过程中逐步扩大部分错位排列的规模,当发现无法找到下一个部分错位排列的元素时就向上回溯,继续试探,当当回溯至栈空间首元素且栈空间首元素stack[0]==N+1时,表明首元素为2,–,N的所有错位排列已全部试探得到,错位排列生成完毕,退出循环。这里给出算法,该算法生成对应于1,2,—,N的所有N元错位排列

代码(C++)

#include <vector>
#include <iostream>
using namespace std;#define N 5   //问题规模,生成对应于1,2,---,N的所有N元错位排列int Search(const vector<bool>& occupy, int i, int j)
{for (; i < occupy.size(); ++i){if (i + 1 != j && occupy[i] == false){return i + 1;}}return 0;
}int main()
{vector<int> a(N, 0);vector<bool> occupy(N, false);  //对于栈中已生成的错位排列中的任意值i,occupy[i-1]==true,对于1,2---,N中不在错位排列栈中的任意元素i,occupy[i-1]=falsebool TF = true;  //循环过程中回溯至本层为false,前进至本层为trueint i = 0;  //存放错位排列的栈的栈顶指针int count = 0;  //统计错位排列数while (true){if (TF == false && i == 0 && a[i] == N)break;int temp;if (TF == false)occupy[a[i] - 1] = false;if (TF == true && (temp = Search(occupy, 0, i + 1)) == 0 || TF == false && (temp = Search(occupy, a[i], i + 1)) == 0){--i;TF = false;continue;}else{a[i] = temp;occupy[temp - 1] = true;}if (i != a.size() - 1){++i;TF = true;}else{++count;cout << "第" << count << "个错位排列:" << endl;for (const int& m : a){cout << m << " ";}cout << endl;for (int j = 1; j <= N; ++j){cout << j << " ";}cout << endl;cout << endl;TF = false;}}return 0;
}

运行结果(N=5时)

生成所有错位排列的算法相关推荐

  1. 经典算法题:全错位排列问题

    问题描述 这是一个很经典的数学问题:有一个人写了n封信件,对应n个信封,然而粗心的秘书却把所有信件都装错了信封,那么一共有多少种装错的装法? 数学抽象 这个问题可抽象为以下一个数学问题:已知一个长度为 ...

  2. 排列组合算法之二: 01转换法_java改变后的c++改进版

    http://blog.csdn.net/canguanxihu/article/details/46363375 排列组合算法之一: 01转换法_java改变后的c++版 class ZuheAss ...

  3. 31. Next Permutation (java 字典序生成下一个排列)

    题目: Implement next permutation, which rearranges numbers into the lexicographically next greater per ...

  4. 排列 组合 算法(一)

    排列组合算法 我们都知道排列与组合的个数可以利用公式很容易的求出来,但是要是把这些排列组合的序列一一输出怎么办呢? 下面结合<组合数学>(第四版)卢开澄卢华明编著,好好总结排列与组合的算法 ...

  5. html错位排列,错位排列的一个计算公式

    错位排列的一个计算公式 本文借助于矩阵的积和式 (本文共4页) 阅读全文>> 根据三次图的结构特点,在R-NW算法和Hybrid方法的基础进行改进,得到了一种更快的计算其... (本文共4 ...

  6. C语言字符串是否为pallindrome排列的算法(附完整源码)

    C语言字符串是否为pallindrome排列的算法 C语言字符串是否为pallindrome排列的算法完整源码(定义,实现,main函数测试) C语言字符串是否为pallindrome排列的算法完整源 ...

  7. C++确定一个字符串是否是另一个字符串的排列的算法(附完整源码)

    C++确定一个字符串是否是另一个字符串的排列的算法 C++确定一个字符串是否是另一个字符串的排列的算法完整源码(定义,实现,main函数测试) C++确定一个字符串是否是另一个字符串的排列的算法完整源 ...

  8. 随机抽样java_java生成抽样随机数的多种算法

    本章先讲解Java随机数的几种产生方式,然后通过示例对其进行演示. 概述: 这里你是不是会说,生成随机数有什么难的?不就是直接使用Java封装好了的random就行了么?当然对于一般情况下是OK的,而 ...

  9. python 排列组合速度_Python实现的简单排列组合算法示例

    本文实例讲述了Python实现的简单排列组合算法.分享给大家供大家参考,具体如下: 1.python语言简单.方便,其内部可以快速实现排列组合算法,下面做简单介绍 2.一个列表数据任意组合 主要是利用 ...

最新文章

  1. Nginx负载均衡配置实例详解
  2. 人工智能预测之七宗罪
  3. 物料管理的容差范围维护
  4. luogu P3234 [HNOI2014]抄卡组
  5. java 不能反序列化_不能将“Java.Lang.Studio”实例反序列化到StaskObl对象令牌中
  6. bestcoder #66
  7. how to add external library in qt under ubuntu
  8. android 高德地图动画,点动态样式-基本功能-示例中心-Loca API 示例 | 高德地图API...
  9. 批处理FOR 中的Delims和Tokens总结
  10. 快速傅里叶变换蝶式运算 matlab,FFT快速傅里叶变换(蝶形算法)详解.ppt
  11. STM32时钟简介及系统时钟频率的更改方式
  12. android x86 最低内存,安卓模拟器低配置版哪个好 电脑内存再小也不怕卡
  13. Python面向对象编程(类编程)中self的含义详解(简单明了直击本质的解释)
  14. UE4打包项目部署到Quest遇到的问题
  15. 管理运筹学笔记一之图解法
  16. 2021年12月远程网络教育大学英语B统考题库复习真题(完整版)
  17. oracle 回收站那些事
  18. 吉林大学软件学院c++优秀课设资源讲解
  19. 钉钉全栈化实践总结-前端篇
  20. 检查mysql敏感词_拼多多违禁词怎么查 拼多多敏感词违规词检测

热门文章

  1. C++ MFC常用API
  2. 深度解析:mPaaS 3.0全新组件 1
  3. 摩飞榨汁杯_距离鲜榨只需10s:摩飞榨汁杯使用体验
  4. turtle绘制图形
  5. windows7 校验下载文件的sha512
  6. 二、Python3自动化运维——IP地址处理模块IPy
  7. java计算机毕业设计HTML5互动游戏新闻网站设计与实现MyBatis+系统+LW文档+源码+调试部署
  8. Excel数据动态看板制作:数据处理、数据分析、看板制作、插入切片器、图表类型
  9. Tita绩效宝:面谈 1:1 的框架
  10. python二进制小数_十进制小数转化为二进制小数