全排列复习

  今天写了蓝桥杯的题目九数组分数发现考了全排列交换法,还好还记得,马上写了出来。

  对于全排列公式 n! ,因为第一个位置有 n 种选择,第二个位置有 n-1 种选择,第 n 个位置有 1 种选择,相乘即得答案。

  假如要对 1 2 3 4 5 进行全排列,第一个位置有5种选择(1,2,3,4,5),第二个位置有4种选择(减去第一个数剩下每一个数都可以来尝试坐一下这个位置),第三个位置有3种选择……对于第一个位置,1,2,3,4,5都要来坐一坐,所以1坐完就和2,交换一下位置,让2来坐一下第一的位置,2坐完以后,再回溯和1换回来,1再和3交换,让3来坐一下宝座,3坐完以后……所以第一个数字要和包括他本身以内的所有数字交换一遍,为什么包括他本身?因为他本身在那里就作为一种排列。

  当第一个位置被抢了以后,剩下的四个数字就来抢第二个宝座,同样,这四个宝座每个人都轮着来坐一回;一样的过程,确认第三第四个位置……直到最后一个位置。

  当最后一个位置都被占满了,一种全排列就形成了,第一种全排列是 1,2,3,4,5.

  5占了最后一个位置,由于他后面没有数字跟他交换了,回溯到第四个位置,4占了第四个位置,此时5也在等待交换位置,他可以和5交换位置,大家都尝试了新的位置,又一种全排列产生;4到了最后的位置也没人和他交换了,和5换回位置;回溯到3,3这个位置4,5都要来尝试一波,所以3先和4交换,4已经占用了第三个位置,至于后面两个位置就随便交给3和5折腾了;接下来就是不断的交换,直到完毕。

DFS全排列

#include<stdio.h>

int arr[]={1,2,3,4,5};

void swap(int a,int b)    //a,b表示数组下标 
{
    int temp;
    temp=arr[a];
    arr[a]=arr[b];
    arr[b]=temp;
} 

void Fullsort(int n)
{
    if(n==5)    //输出 
    {
        int i;
        for(i=0;i<=4;i++)
            printf("%d ",arr[i]);
        printf("\n");
        return;
    }
    
    int i;
    for(i=n;i<=4;i++)    //第n个位置的数分别与后面4-n个位置的数(包含本身)交换 
    {
        swap(n,i);
        Fullsort(n+1);
        swap(n,i);    //换回来
    }
}

int main()
{
    Fullsort(0);
    return 0;
}

 

posted @ 2019-03-22 17:20  一转身已万水千山  阅读(198)  评论(0编辑  收藏  举报