初探回溯法(生成1-n的排列)

程序的大概要求就是
输入1,输出1
输入2,输出1,2 2,1
输入3,输出1,2,3 1,3,2 2,1,3 2,3,1 3,1,2 3,2,1

说起回溯法,其实我们已经接触了好多了,比如汉诺塔,用递归来实现进制转化,深搜等等。除了深搜可能有点难以理解之外,前两种都是比较好理解的。今天在做搜索题目看到了这个题目,我一直认为是用for循环做,可是Google了一下,发现这是典型的回溯法题目(足见我有多么菜)。
还是来看看上面那个程序的代码吧(理解不了的话把3代入,手工模拟一遍即可)

#include <cstdio>
#include <cstring>

void  print_arrange(int, int *, int);
int main()
{
    int n;
    int num[12];
    while(scanf("%d", &n)!=EOF&&n)
    {
        memset(num, 0, sizeof(num));
        print_arrange(n, num, 0);
    }
    return 0;
}

void print_arrange(int n, int * num, int cur)
{

    if(cur==n)//递归终止条件
    {
        for(int i=0; i<n; i++)
            printf("%d", num[i]);
        printf("\n");
    }
    else
    {
        for(int i=1; i<=n; i++)
        {
            int flag=1;
            for(int j=0; j<cur;j++)
                if(num[j]==i)
                    flag=0;
            if(flag)
            {
                num[cur]=i;
                print_arrange(n, num, cur+1);//继续递归
            }
        }
    }
}

你可能感兴趣的:(递归,搜索,回溯法)