zoukankan      html  css  js  c++  java
  • 全排列复习

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

      对于全排列公式 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("
    ");
            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;
    }
  • 相关阅读:
    栈大小和内存分部问题
    inline和宏之间的区别
    两个栈实现双端队列
    Hibernate学习笔记-Hibernate关系映射
    Hibernate学习笔记-Hibernate HQL查询
    Hibernate学习笔记--第一个Hibernate框架程序
    Hibernate学习笔记--Hibernate框架错误集合及解决
    Java学习笔记--对象克隆
    Scala学习笔记--文件IO
    Java学习笔记--Socket和ServerSocket
  • 原文地址:https://www.cnblogs.com/chiweiming/p/10579246.html
Copyright © 2011-2022 走看看