版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_24003469/article/details/82697457
理论和实际的差距使用时间来时间来的衡量,看着一个简单的算法。我编写了一个多小时。。。。。。这个算法最后的输出比正确个数少1,因为最后那个序列检验完毕后,认为没后续序列了,就没输出最后一个序列,比如123,这个序列,最后的213是没有输出的 Johnson-Trotter:
void swap_int(int *first, int *second)
{
int temp = 0;
temp = *first;
*first = *second;
*second = temp;
}
void swap_char(char *fist, char *seond)
{
char temp;
temp = *fist;
*fist = *seond;
*seond = temp;
}
int check(int B[],char mark_s[])
{
int n = 4;
int max_index = 0;
int max_move = 0;
for (int i=1;i<=n;i++)
{
if (mark_s[i]=='0')
{
if (i!=1 && (B[i-1] < B[i]))
{
if (B[i] > max_move)
{
max_move = B[i];
max_index = i;
}
}
}
else
{
if(i!=n && (B[i] >B[i+1]))
if (B[i] > max_move)
{
max_move = B[i];
max_index = i;
}
}
}
/*if (max_index)
{
for (int j = 1;j<=n;j++)
if (B[j] > max_move)
if (mark_s[j] =='0')
mark_s[j] ='1';
else
mark_s[j] = '0';
}*/
return max_index;
}
int main()
{
int index_move = 0,data=0;
int count = 0;
int n = 4;
int A[n+1];
char mark[n+1];
for (int i = 1;i<=n;i++)
{
A[i] = i;
mark[i] = '0';
}
// printf("bingdss");
while((index_move = check(A,mark)))
{
count ++;
data = A[index_move];
for (int k = 1;k<=n;k++)
printf("%c",mark[k]);
printf(" ");
// printf("bing");
for (int k = 1;k<=n;k++)
printf("%d",A[k]);
printf(" ");
if (index_move)
{
for (int j = 1;j<=n;j++)
if (A[j] > data)
if (mark[j] =='0')
mark[j] ='1';
else
mark[j] = '0';
}
if (mark[index_move]=='0')
{
swap_int(&A[index_move-1],&A[index_move]);
swap_char(&mark[index_move-1],&mark[index_move]);
}
else
{
swap_int(&A[index_move],&A[index_move+1]);
swap_char(&mark[index_move],&mark[index_move+1]);
}
}
printf("%d ",count);
return 0;
}