Markdown版题解附思路#创作计划#
2024-01-06 22:55:22
发布于:广东
62阅读
0回复
0点赞
题意
按照字典序输出自然数 到 所有不重复的排列,即 的全排列,要求所产生的任一数字序列中不允许出现重复的数字。
题目要求我们输出的是的全排列,而不是组合(组合与排列的区别)
所以我们可以利用深度优先搜索的特性(DFS),来解决这道题目
- 首先我们已知的样例如下:
输入:3
输出:
1 2 3
1 3 2
2 1 3
2 3 1
3 1 2
3 2 1
即在DFS中每达到一次规定的数字数量,输出,同时保证不重复。
相当于套个DFS的模板。
注意:输出时:每个数字保留 个场宽。
AC CODE:
/*
原创:lan_chance
*/
#include<bits/stdc++.h> //导入快乐的头文件
using namespace std; //导入快乐的命名空间
int n,a[105],vis[105]; //可开long long,创建输出的数字数组和记录是否使用过的数组,还有输入的数字n
int DFS(int p){ //相当于DFS
if(n+1==p){ //当循环深度达到 n + 1 时,说明有了n个数字,如果改成 if(n==p) 就会少一个数字
for(int i=1;i<=n;i++) cout<<setw(5)<<a[i]; //输出场宽为5的n个数字
cout<<endl; //换行保证下一次输出
}
for(int i=1;i<=n;i++){ //1~n的数字,不重复原因是循环1~n,没有减i的值
if(vis[i]==0){ //当这个数字没用过时
vis[i]=1; //标记
a[p]=i; //加入数字数组
DFS(p+1); //下一次搜素
vis[i]=0; //解除标记
}
}
}
int main(){
cin>>n;
DFS(1); //从1开始
return 0;
}
- 结语:此题为模板题,如果还是不太理解,建议重新学习DFS板块!
这里空空如也
有帮助,赞一个