题目意思很明显,这里便不做解释了
思路分析1:
考虑DFS
可以作一个模拟,模拟将1到n这n个数字放到n个箱子的问题,用一个vector作为箱子,
对于每一个箱子,都有n种可能性(因为有n个数字),因此每一次递归都需要循环遍历n个数字,同时我们还需要记录下每一个数字是否被使用过,递归终点就是所有箱子都放满了
#include<iostream>
#include<vector>
using namespace std;
int n;
vector<int>temp;
vector<bool>visited;
void dfs(int index) {//index代表箱子编号
if (index == n) {
for (int i = 0; i < n; i++) {
cout << " " << temp[i];//输出所有箱子数字
}
cout << endl;
}
else {
for (int i = 1; i <= n; i++) {
if (!visited[i]) {
visited[i] = true;
temp.push_back(i);
dfs(index + 1);
temp.pop_back();//回溯时记得恢复原状
visited[i] = false;
}
}
}
}
int main()
{
cin >> n;
for (int i = 1; i <= n + 1; i++) {
visited.push_back(false);
}//初始化
dfs(0);
return 0;
}
思路2:
如果你足够“见多识广”的话,应该知道在algorithm头文件里存在两个全排列函数
具体了解可以进入上面链接
这里直接给代码
#include <iostream>
#include <algorithm>
using namespace std;
int main()
{
int n;
cin >> n;
int* arr = new int[n];
for (int i = 0; i < n; i++) {
arr[i] = i+1;
}
do
{
for (int i = 0; i < n; i++) {
cout << " " << arr[i];
}
cout << endl;
} while (next_permutation(arr, arr + n));
return 0;
}