一道迅雷笔试题

 

          用C++写一个函数, 如 Foo(const char *str), 打印出 str 的全排列,
如 abc 的全排列: abc, acb, bca, dac, cab, cba !

 

本人收集解法(声明不是我做的哈!)

  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/t",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

 


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值