2

私は昨夜、再帰を使わずにハノイの塔を実装することに取り組んできました。ウィキペディアで、TOHのウィキ ページウィキで同じトピックに関するアルゴリズムを見つけました。私はそれを実装しました、それはうまくいきます(奇数の場合:今のところ)。しかし、私はコードに満足できず、ちょっとかさばるので、実際のコード行が同じ機能とアルゴリズムを念頭に置いて削減されるように変更したいと考えています。

#include<stdio.h>
#include<math.h>
#include<stdlib.h>

display(int *A, int *B, int *C, int atop , int btop ,int ctop)
{
    int i;
    if(A[0]==0)
        printf("\nEmpty A");
    else
    {
        printf("\nA Stack :\n");
        for (i=atop; i>=1; i--)
        {
            printf("  %d\n",A[i]);
        }
    }

    if(B[0]==0)
        printf("\nEmpty B\n");
    else
    {
        printf("\nB Stack: \n");
        for (i=btop; i>=1; i--)
        {
            printf("  %d\n",B[i]);
        }
    }

    if(C[0]==0)
        printf("\nEmpty C\n");
    else
    {
        printf("\nC Stack: \n");
        for (i=ctop; i>=1; i--)
        {
            printf("  %d\n",C[i]);
        }
    }

}


int main()
{
    int step=0;
    int n,i,*A,*B,*C,atop,btop,ctop,count=0;
    int max=1;


    printf("\nInput # disks");
    scanf("%d",&n);

    for(i=0; i<n; i++)
    {
        max*=2;
    }
    max=max-1;
    printf("\n Max is :%d",max);
    A= (int *)malloc(sizeof(int)*(n+1));
    B= (int *)malloc(sizeof(int)*(n+1));
    C= (int *)malloc(sizeof(int)*(n+1));
    A[0]=B[0]=C[0]=0;
    atop=btop=ctop=0;
    for(i=n; i>0; i--)
    {
        atop++;
        A[0]++;
        A[atop]=i;
        B[atop]=0;
        C[atop]=0;
    }

    display(A,B,C,atop,btop,ctop);


    do
    {
        count+=1;
        step=(step%3)+1;


        switch(step)
        {

        case 1://move between pegs A and C

            printf("\n%d count:",count);
            if(count%2 ==1)//move of disk 1
            {
                if(A[atop]==1)
                {

                    ctop++;
                    C[ctop]=A[atop];
                    A[atop]=0;
                    atop--;
                    C[0]++;
                    A[0]--;
                    printf("\nDisk %d: A->C",C[ctop]);
                }  //i is on A
                else if(C[ctop]==1)//1 is on b
                {

                    atop++;
                    A[atop]=C[ctop];
                    C[ctop]=0;
                    ctop--;
                    A[0]++;
                    C[0]--;
                    printf("\nDisk %d: C->A",A[atop]);

                }
            }//Movement of disk #1

            else if(count %2 ==0)
            {
                if(ctop !=0 && A[atop]>C[ctop])
                {
                    //C[0]--;
                    atop++;
                    A[atop]=C[ctop];
                    C[ctop]=0;
                    ctop--;
                    C[0]--;
                    A[0]++;
                    printf("\nDisk %d: C->A",A[atop]);
                }
                else if (ctop ==0)
                {
                    ctop++;
                    C[ctop]=A[atop];
                    A[atop]=0;
                    atop--;
                    C[0]++;
                    A[0]--;
                    printf("\n disk %d:A->C",C[ctop]);
                }
                else if(atop !=0 && C[ctop]>A[atop])
                {

                    ctop++;
                    C[ctop]=A[atop];
                    A[atop]=0;
                    atop--;
                    C[0]++;
                    A[0]--;
                    printf("\nDisk %d: A->C",C[ctop]);

                }
                else if(atop==0)
                {
                    atop++;
                    A[atop]=C[ctop];
                    C[ctop]=0;
                    ctop--;
                    C[0]--;
                    A[0]++;
                    printf("\nDisk %d: C->A",A[atop]);
                }

            }//Movement of Disk non1


            break;


        case 2://move between pegs A and B

            printf("\n%d count:",count);
            if(count%2 ==1)//move of disk 1
            {
                if(A[atop]==1)
                {

                    btop++;
                    B[btop]=A[atop];
                    A[atop]=0;
                    atop--;
                    B[0]++;
                    A[0]--;
                    printf("\nDisk %d: A->B",B[btop]);
                }  //i is on A
                else if(B[btop]==1)//1 is on b
                {

                    atop++;
                    A[atop]=B[btop];
                    B[btop]=0;
                    btop--;
                    A[0]++;
                    B[0]--;
                    printf("\nDisk %d: B->A",A[atop]);

                }
            }//Movement of disk #1

            else if(count %2 ==0)
            {
                if(btop !=0 && A[atop]>B[btop])
                {
                    //B[0]--;
                    atop++;
                    A[atop]=B[btop];
                    B[btop]=0;
                    btop--;
                    B[0]--;
                    A[0]++;
                    printf("\nDisk %d: B->A",A[atop]);
                }
                else if (btop ==0)
                {
                    btop++;
                    B[btop]=A[atop];
                    A[atop]=0;
                    atop--;
                    B[0]++;
                    A[0]--;
                    printf("\n disk %d:A->B",B[btop]);
                }
                else if(atop !=0 && B[btop]>A[atop])
                {

                    btop++;
                    B[btop]=A[atop];
                    A[atop]=0;
                    atop--;
                    B[0]++;
                    A[0]--;
                    printf("\nDisk %d: A->B",B[btop]);

                }
                else if(atop==0)
                {
                    atop++;
                    A[atop]=B[btop];
                    B[btop]=0;
                    btop--;
                    B[0]--;
                    A[0]++;
                    printf("\nDisk %d: B->A",A[atop]);
                }

            }//Movement of Disk non1


            break;

        case 3://move between pegs C and B

            printf("\n%d count:",count);
            if(count%2 ==1)//move of disk 1
            {
                if(C[ctop]==1)
                {

                    btop++;
                    B[btop]=C[ctop];
                    C[ctop]=0;
                    ctop--;
                    B[0]++;
                    C[0]--;
                    printf("\nDisk %d: C->B",B[btop]);
                }  //i is on C
                else if(B[btop]==1)//1 is on b
                {

                    ctop++;
                    C[ctop]=B[btop];
                    B[btop]=0;
                    btop--;
                    C[0]++;
                    B[0]--;
                    printf("\nDisk %d: B->C",C[ctop]);

                }
            }//Movement of disk #1

            else if(count %2 ==0)
            {
                if(btop !=0 && C[ctop]>B[btop])
                {
                    //B[0]--;
                    ctop++;
                    C[ctop]=B[btop];
                    B[btop]=0;
                    btop--;
                    B[0]--;
                    C[0]++;
                    printf("\nDisk %d: B->C",C[ctop]);
                }
                else if (btop ==0)
                {
                    btop++;
                    B[btop]=C[ctop];
                    C[ctop]=0;
                    ctop--;
                    B[0]++;
                    C[0]--;
                    printf("\n disk %d:C->B",B[btop]);
                }
                else if(ctop !=0 && B[btop]>C[ctop])
                {

                    btop++;
                    B[btop]=C[ctop];
                    C[ctop]=0;
                    ctop--;
                    B[0]++;
                    C[0]--;
                    printf("\nDisk %d: C->B",B[btop]);

                }
                else if(ctop==0)
                {
                    ctop++;
                    C[ctop]=B[btop];
                    B[btop]=0;
                    btop--;
                    B[0]--;
                    C[0]++;
                    printf("\nDisk %d: B->C",C[ctop]);
                }

            }//Movement of Disk non1


            break;


        default:
            printf("Some Error!");
        }//switch end
//        display(A,B,C,atop,btop,ctop);
    }
    while((count <=max) && (C[0]!=n) );

    printf("\n");
    //display(A,B,C,atop,btop,ctop);
            display(A,B,C,atop,btop,ctop);

    return 0;
}

親切に私を助けてください。

4

1 に答える 1