生成所有错位排列的算法
所谓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时)
生成所有错位排列的算法相关推荐
- 经典算法题:全错位排列问题
问题描述 这是一个很经典的数学问题:有一个人写了n封信件,对应n个信封,然而粗心的秘书却把所有信件都装错了信封,那么一共有多少种装错的装法? 数学抽象 这个问题可抽象为以下一个数学问题:已知一个长度为 ...
- 排列组合算法之二: 01转换法_java改变后的c++改进版
http://blog.csdn.net/canguanxihu/article/details/46363375 排列组合算法之一: 01转换法_java改变后的c++版 class ZuheAss ...
- 31. Next Permutation (java 字典序生成下一个排列)
题目: Implement next permutation, which rearranges numbers into the lexicographically next greater per ...
- 排列 组合 算法(一)
排列组合算法 我们都知道排列与组合的个数可以利用公式很容易的求出来,但是要是把这些排列组合的序列一一输出怎么办呢? 下面结合<组合数学>(第四版)卢开澄卢华明编著,好好总结排列与组合的算法 ...
- html错位排列,错位排列的一个计算公式
错位排列的一个计算公式 本文借助于矩阵的积和式 (本文共4页) 阅读全文>> 根据三次图的结构特点,在R-NW算法和Hybrid方法的基础进行改进,得到了一种更快的计算其... (本文共4 ...
- C语言字符串是否为pallindrome排列的算法(附完整源码)
C语言字符串是否为pallindrome排列的算法 C语言字符串是否为pallindrome排列的算法完整源码(定义,实现,main函数测试) C语言字符串是否为pallindrome排列的算法完整源 ...
- C++确定一个字符串是否是另一个字符串的排列的算法(附完整源码)
C++确定一个字符串是否是另一个字符串的排列的算法 C++确定一个字符串是否是另一个字符串的排列的算法完整源码(定义,实现,main函数测试) C++确定一个字符串是否是另一个字符串的排列的算法完整源 ...
- 随机抽样java_java生成抽样随机数的多种算法
本章先讲解Java随机数的几种产生方式,然后通过示例对其进行演示. 概述: 这里你是不是会说,生成随机数有什么难的?不就是直接使用Java封装好了的random就行了么?当然对于一般情况下是OK的,而 ...
- python 排列组合速度_Python实现的简单排列组合算法示例
本文实例讲述了Python实现的简单排列组合算法.分享给大家供大家参考,具体如下: 1.python语言简单.方便,其内部可以快速实现排列组合算法,下面做简单介绍 2.一个列表数据任意组合 主要是利用 ...
最新文章
- Nginx负载均衡配置实例详解
- 人工智能预测之七宗罪
- 物料管理的容差范围维护
- luogu P3234 [HNOI2014]抄卡组
- java 不能反序列化_不能将“Java.Lang.Studio”实例反序列化到StaskObl对象令牌中
- bestcoder #66
- how to add external library in qt under ubuntu
- android 高德地图动画,点动态样式-基本功能-示例中心-Loca API 示例 | 高德地图API...
- 批处理FOR 中的Delims和Tokens总结
- 快速傅里叶变换蝶式运算 matlab,FFT快速傅里叶变换(蝶形算法)详解.ppt
- STM32时钟简介及系统时钟频率的更改方式
- android x86 最低内存,安卓模拟器低配置版哪个好 电脑内存再小也不怕卡
- Python面向对象编程(类编程)中self的含义详解(简单明了直击本质的解释)
- UE4打包项目部署到Quest遇到的问题
- 管理运筹学笔记一之图解法
- 2021年12月远程网络教育大学英语B统考题库复习真题(完整版)
- oracle 回收站那些事
- 吉林大学软件学院c++优秀课设资源讲解
- 钉钉全栈化实践总结-前端篇
- 检查mysql敏感词_拼多多违禁词怎么查 拼多多敏感词违规词检测
热门文章
- C++ MFC常用API
- 深度解析:mPaaS 3.0全新组件 1
- 摩飞榨汁杯_距离鲜榨只需10s:摩飞榨汁杯使用体验
- turtle绘制图形
- windows7 校验下载文件的sha512
- 二、Python3自动化运维——IP地址处理模块IPy
- java计算机毕业设计HTML5互动游戏新闻网站设计与实现MyBatis+系统+LW文档+源码+调试部署
- Excel数据动态看板制作:数据处理、数据分析、看板制作、插入切片器、图表类型
- Tita绩效宝:面谈 1:1 的框架
- python二进制小数_十进制小数转化为二进制小数