主题:帮帮忙,推推规律
编程中无意识地遇到该如何实现将数组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,而不需进行花费太多的系统开销
提示:附件中的图解会让你理解更方便
最近才将自己去年单独研究得到的成果整理出来:以下是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,而不需进行花费太多的系统开销
提示:附件中的图解会让你理解更方便