用遞歸與非遞歸方法實現漢諾塔問題,C語言實現

如題,直接上代碼,註釋寫的很全了
非遞歸還是用棧實現

/*包含頭文件*/
#include <stdio.h>
#define MAXSIZE 60
/*函數聲明*/
void Hanoi1(int n, char a, char b, char c);
void Hanoi2(int n, char a, char b, char c);
void PrintHanoi(int no, char from, char to);

typedef struct
{
    char a,b,c;
    int flag,num;
}stack;

int main()
{
    int n;
    printf("請輸入移動圓盤的個數:\n");
    scanf("%d",&n);
    printf("漢諾塔的遞歸實現:\n");
    Hanoi1(n,'a','b','c');
    printf("漢諾塔的非遞歸實現:\n");
    Hanoi2(n,'a','b','c');
    return 0;
}

void PrintHanoi(int no, char from, char to)//輸出漢諾塔的圓盤移動過程
{
    printf("將第%d個圓盤從%c移動到%c\n",no,from,to);
}

void Hanoi1(int n, char a, char b, char c)
{
    if (n==1) PrintHanoi(n,a,c);
    else
    {
        Hanoi1(n-1,a,c,b);
        PrintHanoi(n,a,c);
        Hanoi1(n-1,b,a,c);
    }
}

void Hanoi2(int n, char a, char b, char c)
{
    int top=1,a1,b1,c1,m;
    stack s[MAXSIZE];
    //初值入棧
    s[top].num=n;
    s[top].flag=1;
    s[top].a=a;
    s[top].b=b;
    s[top].c=c;
    while(top>0)
    {
        if (s[top].flag==1)
        {
            //退棧hanoi(n,a,b,c),相當於在遞歸函數中將實參傳給形參
            m=s[top].num;
            a1=s[top].a;
            b1=s[top].b;
            c1=s[top].c;
            top--;
            /*將hanoi(n-1,a,b,c)入棧,相當於在遞歸函數中的第一個遞歸調用函數,
              將編號爲1~n-1的圓盤從塔座a移動到b,c作爲輔助塔座*/
            top++;
            s[top].num=m-1;
            s[top].flag=1;
            s[top].a=b1;
            s[top].b=a1;
            s[top].c=c1;
            //將第n個圓盤從a移動到c
            top++;
            s[top].num=m;
            s[top].flag=0;
            s[top].a=a1;
            s[top].c=c1;
            /*將hanoi(n-1,b,a,c)入棧,相當於在遞歸函數中的第一個遞歸調用函數,
              將編號爲1~n-1的圓盤從塔座b移動到c,a作爲輔助塔座*/
            top++;
            s[top].num=m-1;
            s[top].flag=1;
            s[top].a=a1;
            s[top].b=c1;
            s[top].c=b1;
        }
        while(top>0&&(s[top].flag==0||s[top].num==1))
        {
            if(top>0)//將第n個圓盤從a移動到c,並退棧
            {
                PrintHanoi(s[top].num,s[top].a,s[top].c);
                top--;
            }
        }
    }
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章