漢諾塔的C語(yǔ)言實(shí)現(xiàn)以及冒泡排序

字號(hào):

漢諾塔絕對(duì)是一個(gè)經(jīng)典的算法題目,雖然當(dāng)年也講過,程序也不長(zhǎng),但是一直以來總覺得理解的不清楚,看程序也能明白什么意思,過一段時(shí)間程序忘了,想不起來的時(shí)候,就怎么都想不明白了,雖然說好像是那么回事,就是高不明白。借著前兩天做八皇后的東風(fēng),順便來理一下這個(gè)漢諾塔。園盤從上到下編號(hào)1, 2, ..., n,桿子從左至右A,B,C,A是from,C是to。我還是看了以前的java程序然后自己理解一下寫的C程序,幾乎沒有差別,當(dāng)然寫的時(shí)候也忘了不少,第一遍出來錯(cuò)誤的答案。程序如下:
    #include
    #define INIT_NUM 3
    int count;
    void hanoi(int n, char from, char to, char middle)
    {
    if (n > 0)
    {
    count++;
    hanoi(n-1, from, middle, to);
    printf("Move No.%-2d from %c to %c\n", n, from, to);
    hanoi(n-1, middle, to, from);
    }
    }
    int main(int argc, char *argv[])
    {
    int init = INIT_NUM;
    if (argc==2)
    init = atoi(argv[1]);
    printf("A 是起始桿,C 是輔助桿,B 是目的桿。\n\n");
    hanoi(init, 'A', 'C' , 'B');
    printf("\nCount = %d", count);
    return 0;
    }
    借著這股東風(fēng),考試.大提示再順便寫一下排序的算法實(shí)現(xiàn),冒泡跟快速排序了,現(xiàn)在先寫一個(gè)冒泡排序吧:
    #include
    void show (int *p)
    {
    int i=0;
    for (i=0 ;i<8 ;i++ )
    {
    printf("%3d ", p[i]);
    }
    printf("\n");
    }
    int main(int argc, char *argv[])
    {
    int p[] = {8, 9, 4, 5, 1, 7, 6, 0};
    int i = 0;
    int j = 0;
    int tmp = 0;
    for (i=0 ;i<8 ;i++ )
    {
    for (j=0 ;j<7-i ;j++ )
    {
    if (p[j] > p[j+1])
    {
    tmp = p[j];
    p[j] = p[j+1];
    p[j+1] = tmp;
    }
    }
    printf("第%2d輪排序結(jié)束:", i+1);
    show(p);
    }
    return 0;
    }