编程中无意识地遇到该如何实现将数组ABC(当然该数组的大小应该是可以任意取的)排列成ABC,ACB,BAC,BCA,CAB,BAC的东东,望各位高手指点迷津
    最近才将自己去年单独研究得到的成果整理出来:以下是ABCD排列的所有情况,由一队列操作得到.首先0_(4)   ABCD位于队首将第四位调至首位得1_(3)   DABC插入队尾,由 队尾1_(3)   DABC得到 2_(3)   CDAB插入队尾,又由队尾 2_(3)   CDAB得到3_(3)   BCDA插入队尾,再由队尾进行第四位调至首位会导致重复的情况,此时将0_(4)   ABCD改为0_(3)   ABCD;取队首0_(3)   ABCD将第三位调至首位得4_(2)   CABD插入队尾,由 队尾4_(2)   CABD得到5_(2)   BCAD插入队尾,再由队尾进行第三位调至首位会导致重复的情况,此时将0_(3)   ABCD改为0_(2)   ABCD;如此下去直到0_(1)   ABCD不能进行交换为止,输出队首元素,并将其从队首删除;同样对队首进行以上类似操作直到队列空为止.
   0_(4)   ABCD
  1_(3)   DABC
   2_(3)   CDAB
   3_(3)   BCDA
   4_(2)   CABD
   5_(2)   BCAD
   6_(1)   BACD
   7_(2)   BDAC
   8_(2)   ABDC
   9_(1)   ADBC
  10_(2)   ACDB
  11_(2)   DACB
  12_(1)   DCAB
  13_(2)   DBCA
  14_(2)   CDBA
  15_(1)   CBDA
  16_(1)   ACBD
  17_(1)   CBAD
  18_(1)   DBAC
  19_(1)   BADC
  20_(1)   CADB
  21_(1)   ADCB
  22_(1)   BDCA
  23_(1)   DCBA
#include <stdio.h>
#define tt 4

typedef struct node{
    char  array[tt];
    int key ;
    struct node * next;
}edgenode;

typedef struct vnode
{  edgenode *firstedge;   /*队首指针*/
   edgenode *lastedge;   /*队尾指针*/
}queue;

void pailie(char a[],int n,queue *Q)
{ int i,j,t,v=0,ww,flagkey;
  char b,index[tt],pasa[tt];
  edgenode *s,*index1;

  s=(edgenode *)malloc(sizeof(edgenode));
  s->key=n;
  for(ww=0;ww<tt;ww++)
    s->array[ww]=a[ww];
    s->next=NULL;
  Q->firstedge=Q->lastedge=s;

 while(Q->firstedge)
  {

    for(ww=0;ww<tt;ww++)
    pasa[ww]=Q->firstedge->array[ww];
    flagkey=Q->firstedge->key;
    while(flagkey>=1)
    { /**/for(ww=0;ww<tt;ww++)index[ww]=pasa[ww];
        for(i=1;i<flagkey;i++)
       {
       /*第i个元素放置在最前面*/
           b=index[flagkey-1];
           for(j=flagkey-1;j>0;j--)
              index[j]=index[j-1];
           index[0]=b;

               s=(edgenode *)malloc(sizeof(edgenode));
               s->key=flagkey-1;

               for(ww=0;ww<tt;ww++)
                  s->array[ww]=index[ww];

                s->next=NULL;

               Q->lastedge->next=s;
               Q->lastedge=Q->lastedge->next;


       }
        flagkey=flagkey-1;

     }
         /* for(ww=0;ww<tt;ww++)
              printf("%c",Q->firstedge->array[ww]);*/ /* */
              printf("  ");
              printf("%2d_(%d)   ",v++,Q->firstedge->key);
        puts(Q->firstedge->array);



             index1=Q->firstedge;

           Q->firstedge=Q->firstedge->next;

          free(index1);



 }


}
 void main()
{ int ww;
  queue *QQ;char a[tt]={'A','B','C','D'};
  QQ=(queue *)malloc(sizeof(queue));
  QQ->firstedge=QQ->lastedge=NULL;
   pailie(a,tt,QQ);

   free(QQ);
   getch();



     现在提出问题,给定一个一直字符串然后给你一个在一定范围内的数字,比如ABCD,20,你能否写一个程序直接根据20得出 CADB,而不需进行花费太多的系统开销     


     

提示:附件中的图解会让你理解更方便