排列数字

给定一个整数 n,将数字 1∼n排成一排,将会有很多种排列方法。

现在,请你按照字典序将所有的排列方法输出。

输入格式

共一行,包含一个整数 n。

输出格式

按字典序输出所有排列方案,每个方案占一行。

数据范围

1≤n≤7

输入样例:

3

输出样例:

1 2 3
1 3 2
2 1 3
2 3 1
3 1 2
3 2 1

#include<iostream>
using namespace std;
const int N=10;
int p[N],st[N];//p存储合法情况
int n;//  state st存储(0/1)表示每个数字是否被使用过
void dfs(int u)//u是暴力枚举到的位置
{
    if(u>n)//超过n时 是一种合法情况 直接输出
    {
        for(int i=1;i<=n;++i)
            printf("%d ",p[i]);
        puts("");
        return ;
    }
    for(int i=1;i<=n;++i)
    {
        if(!st[i])//如果这个数字没有使用过那么放在u这个位置
        {
            st[i]=1;//把这个数字按死后面不能用
            p[u]=i;//这个位置放i这个数字
            dfs(u+1);//暴搜下一个位置
//dfs结束时也就意味着这个数字放在这个位置的所有情况全部枚举完毕
//比如这个位置放的是3, 3 2 1 ,3 1 2
//接下来这个位置该放 2 1 的情况了而且后面位置可以放3所以st[3]=1的状态该解除了
//所以下面恢复现场也就是以前是什么样(dfs(u+1)上面 我们限制的地方)就恢复什么样
//pi限制的这个位置放3解除掉sti限制的以后不能放3解除掉
            p[u]=0;
            st[i]=0;
        }
    }
}
int main()
{
    cin>>n;
    dfs(1);
    return 0;
}