浅谈生成全排列的4种方法
来源:互联网 发布:征途最高数据 编辑:程序博客网 时间:2024/05/22 14:47
方法一:最简单的方法,直接使用STL中的next_permutation函数生成排列
#include <bits/stdc++.h>using namespace std;int main(){ char res[] = "ABCD"; do{ puts(res); }while(next_permutation(res, res+4)); return 0;}
方法二:采用递归的思想解决,先输出所有以A开头的排列,然后输出以B开头的排列,接着输出...,最后输出以N开头的排列。以A开头的排列中,第一位是A,后面是B~N的排列。以AB开头的排列中,第一位是A,第二位是B,后面是C~N的排列......如此递归,生成的是按照字典序排列的全排列。
#include <bits/stdc++.h>using namespace std;int n;char table[] = "ABCDEFGHIJK";char res[1024];void solve(int cur){ if(cur == n){ res[cur] = 0; puts(res); return ; } for(int i = 0; i < n; i++){ bool ok = true; for(int j = 0; j < cur; j++) if(table[i] == res[j]) ok = false; if(ok){ res[cur] = table[i]; solve(cur+1); } }}int main(){ while(cin >> n) solve(0); return 0;}
方法三:应该算是回溯法,在课堂上学到的,当时只是感觉用到了排列组合中的一些思想,后来才知道是回溯法。这种方法效率应该最高,但是生成的序列并不按照字典序排列。
首先选择在首位元素,分别A~N,选择方法是与第一位后面的元素交换,然后选择第二位元素,选择方法是与第二位后面的元素交换,如此递归进行......注意递归返回时要把交换过的变量交换回来。
#include <bits/stdc++.h>using namespace std;int n;char res[] = "ABC";void solve(int cur){ if(cur == n){ res[cur] = 0; puts(res); return ; } for(int j = cur; j < n; j++){ swap(res[j], res[cur]); solve(cur+1); swap(res[j], res[cur]); }}int main(){ n = strlen(res); solve(0); return 0;}
#include <bits/stdc++.h>using namespace std;int n;char table[] = "ABCD";char res[1024];bool vis[1024];void solve(int cur){ if(cur == n){ res[cur] = 0; puts(res); return ; } for(int i = 0; i < n; i++){ if(!vis[i]){ res[cur] = table[i]; vis[i] = true; solve(cur+1); vis[i] = false; } }}int main(){ n = strlen(table); memset(vis, false, sizeof(vis)); solve(0); return 0;}
0 0
- 浅谈生成全排列的4种方法
- 生成全排列的两种方法
- 浅谈全排列与组合的生成
- 全排列的生成方法
- 两种生成全排列序列的方法
- 生成全排列的一些方法
- 生成全排列的省事方法
- 全排列的生成
- 全排列的生成
- 全排列的生成
- 全排列的四种生成算法
- 生成字符串的全排列
- 全排列的生成算法
- 全排列的生成算法
- 全排列的生成算法
- 生成字符串的全排列
- 全排列的生成算法
- 全排列的生成算法
- 系统盘垃圾清理批处理
- leetcode_MinStack_题解
- 第十七周 项目2—引用作形参
- 2款JS脚本判断手机浏览器跳转WAP手机网站
- 用百度地图sdk返回详细地址描述
- 浅谈生成全排列的4种方法
- 【iOS】UITextView中添加 placeholder
- linux常见命令
- android 判断Apk是否签名和 签名是否一致
- C# 读取与修改xml一个节点的值
- 18发送文件消息类型的布局
- spring security 概述& 配置文件详解
- linux学习笔记:文件与目录管理
- OC学习笔记(1)