题目要求:实现一组数的全排列输出
假设有n个数,那么在输出的每一组全排列里都有n位数,在每一位上都有n个可能取得的数;我们的要做的就是在一轮全排列当中。为每一个位置选择合适的数,这里合适的是指在当前轮它前边(从左往右看,左为前)的所有数里未取到的数;显然我们需要一个合适的数据结构来存储我们已经选择完的数,并在一轮全排列的选择结束后输出这一轮全排列。
-
一轮指的是找到一组全排列数,即输出的一行
#include<bits/stdc++.h>
using namespace std;
void digui(vector<int> a, vector<int> b) { // b 和 &b 效果一致
// 栈a用来放置原始数据,栈b用来存储已经选择的数
if ((b.size() < a.size())) {
for (int i = 0; i < (int)a.size(); i++) {
int j = 0;
for (; j < (int)b.size(); j++) {
if (a[i] == b[j]) {
break;
}
}
if (j == (int)b.size()) {
b.push_back(a[i]);
digui(a, b);
b.pop_back(); //在每一轮递归结束返回后,pop掉当前已经选择的数
}
}
}
else{ //a.size() == b.size()
for(int i=0;i<(int)b.size();i++){
cout<<b[i]<<" ";//TODO
}
cout<<endl;
return ;
}
return;
}
int main() {
int a[] = {3, 7, 6, 4};
int length = (int)sizeof(a) / (int)sizeof(*a); //获取数组长度
vector<int> data(a, a + length); //将数组a赋给data
vector<int> datab;
digui(data, datab);
return 0;
}
输出结果显示(在dev-c++下跑的代码)
ps:思路和代码都是自己想的,如果有思路相似的家人,欢迎积极讨论