_不会消失的夜晚

导航

关于全排列算法

 /***********************************************/
    void chang(char str[],int m)  /*定义循环左移函数(我没有用左移函数)*/
     {
      int i,j;
      char temp=str[0];
      for (i=0;i<m;i++) str[i]=str[i+1];
      str[i]=temp;
     }
    void pai(char str[],int m,int n) /*定义全排列函数*/
    {
     int k;
     void chang(char str[],int m);
     if (m<n)        /* 定 义 递 归 调 用 出 口  */
      {
       for (k=0;k<=m;k++)
        {
         pai(str,m+1,n); /*递归调用*/
         chang(str,m); /*调用左移函数*/
        }
      }
     else printf("%s ",str);
    }
    #include "stdio.h"
    main()
    {char str[]="ABCD"; /*全排列字符,可以任意多个(相应的下面排列函数中参数"4"改成全排列字符的个数)*/
    clrscr();
    pai(str,0,4); /*这里参数0(下标)表示从第一个元素开始,4表示元素个数(不是下标)*/
    getch();
    }
    /*********************************************/

    下面我来解释一下,我花了近1天的时间,找到这样一个规律如下:
                               ┏ ABCD
                               ┣ BCDA
                     ┏ ABCD ━┫
                     ┃        ┣ CDAB
           ┏ ABCD ━╋ BCAD   ┗ DABC
           ┃        ┃         .
           ┃        ┗ CABD    .
    ABCD ━┫                   .
           ┃        ┏ BACD    .
           ┃        ┃         .
           ┗ BACD ━╋ ACBD   ┏ CBAD
                     ┃        ┣ BADC
                     ┗ CBAD ━┫
                               ┣ ADCB
                               ┗ DCBA
    简化图如下所示 ==>
                         ┏ ABCD
                         ┣ BCDA
                ┏ ABC ━┫
                ┃       ┣ CDAB
        ┏ AB ━╋ BCA   ┗ DABC
        ┃      ┃        .
        ┃      ┗ CAB    .
    A ━┫                .
        ┃      ┏ BAC    .
        ┃      ┃        .
        ┗ BA ━╋ ACB   ┏ CBAD
                ┃       ┣ BADC
                ┗ CBA ━┫
                         ┣ ADCB
                         ┗ DCBA
    大家看到了,以上就是一步一步循环左移就能得到所有全排列的数了.

posted on 2008-10-25 17:33  john948  阅读(322)  评论(0编辑  收藏  举报