Johnson-Trotter

版权声明:本文为博主原创文章,未经博主允许不得转载。 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;
}

猜你喜欢

转载自blog.csdn.net/qq_24003469/article/details/82697457