全排列(深度算法搜索)

法一:

#include<stdio.h>



int a[10], book[10], n; //此处说明一下,C语言的全局变量自动初始化为0
                        //这里的book数组无需全部再次初始化


void dfs(int step) //step表示现在站在第几个盒子面前
{
    int i;


    if(step == n + 1)
    {
        //输出一种排列(1-n号盒子中的扑克牌编号)


        for(i = 1; i <= n; i++)
        {
            printf("%d%c", a[i], i == n?'\n':',');
        }


        return ; // 返回之前的一步, 最近调用dfs的函数的地方


    }


    //此时站在第step个盒子面前,应该放那张牌呢?
//按照1,2,3···n的顺序一一尝试


   for(i = 1; i <= n; i++)
  {
    //判断扑克牌i是否还在手上


    if(book[i] == 0) //book[i]等于0表示i号扑克牌在手里
    {
        //开始尝试使用扑克牌i


        a[step] = i; //将i号扑克牌放入第step个盒子中


        book[i] = 1; //将book[i]设为1,表示此时不在手中


        //第step个盒子已经放好扑克牌,接下来需要放第step+1个盒子


        dfs(step + 1); //这里通过函数的递归调用来实现(自己调用自己)


        book[i] = 0; //这是非常重要的一步,一定要将刚才尝试的扑克牌收走
                     //才能进行下一次尝试
    }


   }


   return ;
}


int main(void)
{
    scanf("%d", &n);
    dfs(1); //首先站在1号小盒子面前


    return 0;


}


法二:


#include<stdio.h>


void swap(int *p, int *q)
{
    int temp = *p;
    *p = *q;
    *q = temp;


}


void perm(int a[], int k, int m)
{
    int i;
    if(k == m)
    {
        for(i = 1; i <= m; i++)
        {
            printf("%d%c", a[i], i == m?'\n':',');
        }
    }


    else
    {
        for(i = k; i <= m; i++)
        {
            swap(&a[k], &a[i]);


            perm(a, k + 1, m);


            swap(&a[k], &a[i]);
        }
    }
}


int main(void)
{
    int t, i, n, a[11];


    while(~scanf("%d", &t))
    {
        scanf("%d", &n);


        for(i = 1; i <= n; i++)
        {
            scanf("%d", &a[i]);
        }


        perm(a, 1, n);


    }


    return 0;
}



猜你喜欢

转载自blog.csdn.net/eider1998/article/details/79943809