《小圌的全排列》蒟蒻解法

1. 小圌的全排列

题目描述

时间限制:1s 空间限制:250M

题目描述:

请你帮小圌编写一个程序,使用递归的方法,按从小到大的顺序输出 1~n 的全排列。

输入格式:

一行,一个数字 n(1≤n≤9)

输出格式:

按字典序从小到大的顺序输出 1∼n 的全排列,每行一个排列,同一行之间数字用一个空格隔开。

输入样例:

3

输出样例:

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

我的解法

这题主要考你的是搜索,所以,我们需要编写一个函数。

void dfs(int k)
{

}

这个 k 我是随便起的:)

既然有了 \color{red}dfs 函数,我们首先要写它的边界是什么。

if(k==n+1)//k已经等于n+1,我们已经不需要它了,就在下面直接输出
{
    for(1~n)
    {
        输出a[i];
    }
    最后别忘了换行和return;
}

边界写好了以后,我们就需要考虑: a[i] 的值往哪来呢?于是,我们就要在下面写一个给 a[i] 赋值的代码。
因为每个数不能重复,所以,我们需要一个 vis[] 数组来帮助我们判断该数是否与前面的重复。
要给数组赋值,我们需要一个循环,循环里套个判断,用于判断 vis[i]={\tiny \left\{\begin{matrix} 0 \\ 1 \end{matrix}\right. }
因为是 \color{red}dfs ,所以我们要在判断里再调用 \color{red}dfs ,对了,别忘了 vis[i] 的赋值和释放以及 a[k] 的赋值。

for(1~n)
{
    if(vis[i]不等于1)
    {
        vis[i]=1;  //把vis[i]赋值为1,说明这个数已经进来过了
        a[k]=i;    //赋值
        dfs(k+1); //自己调用自己
        vis[i]=0; //别忘了释放
    }
}

这样,我们亲爱的 \color{red}dfs 终于编写好了,主函数里只要输入 n 和调用 dfs(1) 就行了。
\large{\color{blue}感}\tiny{\color{purple}谢}\huge{\color{green}观}\small{\color{yellow}看}