题解
【递归】n个数的全排列
2 条题解
-
0
#include <iostream> #include <algorithm> using namespace std; int a[10], b[10]; // a存储当前排列,b存储输入的数字 bool used[10]; // 标记数组,记录某个数字是否已使用 int n; // 打印当前排列 void print() { for(int i = 1; i <= n; i++) { cout << a[i]; if(i < n) cout << " "; } cout << endl; } // 递归函数:为下标为x的位置选择数字 void fun(int x) { // 尝试所有输入的数字 for(int i = 1; i <= n; i++) { // 如果数字b[i]还没有被使用 if(!used[i]) { a[x] = b[i]; // 将位置x赋值为b[i] used[i] = true; // 标记这个数字已被使用 if(x == n) { // 如果已经填到最后一个位置 print(); // 输出这个完整的排列 } else { // 否则 fun(x + 1); // 递归填写下一个位置 } used[i] = false; // 回溯:撤销标记,让这个数字可以用于其他位置 } } } int main() { cin >> n; for(int i = 1; i <= n; i++) { cin >> b[i]; } // 对输入的数字进行排序,保证输出按字典序从小到大 sort(b + 1, b + n + 1); fun(1); // 从第一个位置开始填数字 return 0; } -
0
#include <iostream> #include <algorithm> using namespace std; int a[10], b[10]; // a存储当前排列,b存储输入的数字 bool used[10]; // 标记数组,记录某个数字是否已使用 int n; // 打印当前排列 void print() { for(int i = 1; i <= n; i++) { cout << a[i]; if(i < n) cout << " "; } cout << endl; } // 递归函数:为下标为x的位置选择数字 void fun(int x) { // 尝试所有输入的数字 for(int i = 1; i <= n; i++) { // 如果数字b[i]还没有被使用 if(!used[i]) { a[x] = b[i]; // 将位置x赋值为b[i] used[i] = true; // 标记这个数字已被使用 if(x == n) { // 如果已经填到最后一个位置 print(); // 输出这个完整的排列 } else { // 否则 fun(x + 1); // 递归填写下一个位置 } used[i] = false; // 回溯:撤销标记,让这个数字可以用于其他位置 } } } int main() { cin >> n; for(int i = 1; i <= n; i++) { cin >> b[i]; } // 对输入的数字进行排序,保证输出按字典序从小到大 sort(b + 1, b + n + 1); fun(1); // 从第一个位置开始填数字 return 0; }
- 1