编写一个程序,提示用户输入一个数字n,然后输出1,2,3,...,n数字序列的所有排列组合,例如,如果n为3,则程序应输出: 1 2 3
1 3 2
2 1 3
2 3 1
3 1 2
3 2 1
谢谢各位,我解出来了。。。。。。大家可否能对我的代码进行一下点评。。。 #include <iostream> #include <vector> #include <iomanip>
using namespace std;
const int PRINT_WIDTH = 4;
/* 构造数列 */ vector<int> construct_num_queue(int n);
/* 插入元素 */ void insert_element(vector<int>& v,int pos,int value); /* 排列组合 */ void permutation(vector<int> queue,vector<int> to_permute); /* 打印数列 */ void print_vector(const vector<int>& v);
int main() { int n; vector<int> n_queue; vector<int> permute(1); cout << "Please input n for permutation :"; cin >> n; if(cin.fail()) { cout << "Invailed input event occupied!" << endl; return 1; } if(n <= 0) { cout << "Value impossible!" << endl; return 1; }
n_queue = construct_num_queue(n); permutation(n_queue,permute);
return 0; }
vector<int> construct_num_queue(int n) { vector<int> result(n); for(int i = 0; i < n; i++) result[i] = i+1; return result; }
void insert_element(vector<int>& v,int pos,int value) { v.push_back(0); /* 扩充向量 */ int i; for(i = v.size() - 2; i >= pos; i--) v[i+1] = v[i]; v[pos] = value; }
void print_vector(const vector<int>& v) { for(int i = 0; i < v.size(); i++) cout << setw(PRINT_WIDTH) << v[i]; cout << endl; }
void permutation(vector<int> queue,vector<int> to_permute) { if(queue.size() == 0) { to_permute.pop_back(); /* 删除初始化的一项0 */ print_vector(to_permute); } else { vector<int> mir_queue = queue; /* 映射列队向量 */ vector<int> mir_to_permute = to_permute; /* 映射排列向量 */ vector<int> bak_vector; /* 备份向量 */
int back_value = mir_queue[mir_queue.size()-1]; /* 取出列队向量最后一个元素 */ mir_queue.pop_back(); /* 最后一个元素从向量中弹出 */ for(int i = 0; i < mir_to_permute.size(); i++) { /* 生成插孔的位置 */ bak_vector = mir_to_permute; /* 备份映射的队列向量 */ insert_element(mir_to_permute,i,back_value); permutation(mir_queue,mir_to_permute); /* 递归调用 */ mir_to_permute = bak_vector; /* 还原备份 */ } } }