给定一个整数 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 |
| 总通过数:95837 |
| 总尝试数:121097 |
| 来源:模板题 |
| 算法标签 |
1.深度优先搜索:只要所有数字使用完成,就输出该种情况
- if(u>n)
- {
- for(int i=1;i<=n;i++) printf("%d ",path[i]);
- printf("\n");
- return;
- }
2.path[i]表示一条路径,每一个位置可以放置一个数字
3.恢复现场:改变路径上面的数字,数字的使用状态(数字被使用之后标记为true) ,递归到下一个数字,然后恢复现场,把路径上面的数字恢复为0(其实不恢复也没关系,因为下一次使用赋值会直接覆盖原来的数字),把数字的使用状态恢复为未使用(false)
- for(int i=1;i<=n;i++)
- {
- if(!state[i])
- {
- path[u]=i;
- state[i]=true;
- dfs(u+1);
- path[u]=0;
- state[i]=false;
- }
- }
- #include
- using namespace std;
-
- const int N=10;
- int n,path[N];
- bool state[N];
-
- void dfs(int u)
- {
- if(u>n)
- {
- for(int i=1;i<=n;i++) printf("%d ",path[i]);
- printf("\n");
- return;
- }
- for(int i=1;i<=n;i++)
- {
- if(!state[i])
- {
- path[u]=i;
- state[i]=true;
- dfs(u+1);
- path[u]=0;
- state[i]=false;
- }
- }
- }
-
- int main()
- {
- scanf("%d",&n);
- dfs(1);
-
- return 0;
- }