题目:
题意分析:
给出大小为n的数字,输出1~n的全排列,不允许重复数字
eg: 123 132 213 231 321 312(n=3)
解题思路:
首先讲解DFS,所谓dfs就是深度优先遍历,简单来说"一条路走到黑,不撞南墙不回头",当到达最深处时,然后返回,上一层即里深处最近的一层,从上一层继续深度遍历,以此类推!
回溯标记:在dfs时我们需要标记,已经用过的数字,保证数字不重复!当用过后我们还要取消标记!
我想大部分的人都晕掉了!
我把这道题的状态树画出来!大家就一目了然。
*黄色的路线是可以得到的!!*依次类推我们还可以画出,以2为根节点,以3为根节点的图,大家不要手懒,一起画一下~~嘻嘻
我们在完成从根节点到其中一条分叉时都要取消标记,不然下一个叉无法使用该数字。
void dfs(int deep)
{
if(deep>n)//深搜到底情况
{
//打印1~n全排列
for(int i=1;i<=n;i++)
{
printf("%5d",a[i