给定一个整数 nn,将数字 1∼n1∼n 排成一排,将会有很多种排列方法。
现在,请你按照字典序将所有的排列方法输出。
共一行,包含一个整数 nn。
按字典序输出所有排列方案,每个方案占一行。
1≤n≤71≤n≤7
3
- 1 2 3
- 1 3 2
- 2 1 3
- 2 3 1
- 3 1 2
- 3 2 1
| 难度:简单 |
| 时/空限制:1s / 64MB |
| 总通过数:96065 |
| 总尝试数:121392 |
| 来源:模板题 |
| 算法标签 |
没有想到几天之前非常熟练的模板题现在忘得差不多了,看来之前写过的题目需要复习一下hh
1.深度优先搜索:达到我们需要的要求,也就是说走到终点,我们就输出答案
- if(u>n)
- {
- for(int i=1;i<=n;i++) printf("%d ",g[i]);
- printf("\n");
- return;
- }
2.判断每一次搜索每一个数字的状态,我们不能使用已经使用过的数字
- for(int i=1;i<=n;i++)
- {
- if(!state[i])
- {
- state[i]=true;
- g[u]=i;
- dfs(u+1);
- state[i]=false;
- g[u]=0;
- }
- }
并且循环需要从1开始使用,因为我们使用的数字是从1开始使用的
先修改数字的状态,然后把相应的数字存到我们需要输出的路径数组里面,然后递归调用函数本身,然后恢复现场,把原来的状态恢复
3.代码细节是输出的时候下标是i,刚刚手残写成了g[N],输出很大的数字,非常奇怪的bug
for(int i=1;i<=n;i++) printf("%d ",g[i]);
4.万能头文件在acwing上运行时间(这道题目) 是9ms,iostream是11ms,是啥情况
- #include
- using namespace std;
-
- int n;
- const int N=10;
- int g[N];
- bool state[N];
-
- void dfs(int u)
- {
- if(u>n)
- {
- for(int i=1;i<=n;i++) printf("%d ",g[i]);
- printf("\n");
- return;
- }
- for(int i=1;i<=n;i++)
- {
- if(!state[i])
- {
- state[i]=true;
- g[u]=i;
- dfs(u+1);
- state[i]=false;
- g[u]=0;
- }
- }
- }
-
- int main()
- {
- scanf("%d",&n);
- dfs(1);
- return 0;
- }