全排列问题
题目
输出自然数 1 到 n 所有不重复的排列,即 n 的全排列,要求所产生的任一数字序列中 不允许出现重复的数字。
Input
一个整数 n。
Output
由 1∼n 组成的所有不重复的数字序列,每行一个序列。
每个数字保留 5 个场宽。
输入
3
输出
1 2 3
1 3 2
2 1 3
2 3 1
3 1 2
3 2 1
解题思路
题目比较简单,有很多方法都能ac,本文章只介绍用dfs的方法,也就是递归求解。
代码如下
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<iomanip>
using namespace std;
const int N=10;
bool vis[N]; //标记以访问的数字
int a[N];
int n;
void dfs(int x)
{
if(x == n+1)//判断是否到达边界
{
for(int i=1;i<=n;i++)
{
cout <<setw(5)<<a[i]; //stew()函数的用法
}
cout <<endl;
return ;
}
for(int i=1;i<=n;i++)
{
if(vis[i] == 0)
{
vis[i]=1;
a[x]=i;
dfs(x+1);
vis[i]=0; //回溯
}
}
}
int main()
{
cin>>n;
dfs(1);
return 0;
}