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}看}