汉诺塔的C语言实现以及冒泡排序

来源:互联网 发布:秃鹰全套配件淘宝 编辑:程序博客网 时间:2024/05/20 22:04
汉诺塔绝对是一个经典的算法题目,虽然当年也讲过,程序也不长,但是一直以来总觉得理解的不清楚,看程序也能明白什么意思,过一段时间程序忘了,想不起来的时候,就怎么都想不明白了,虽然说好像是那么回事,就是高不明白。借着前两天做八皇后的东风,顺便来理一下这个汉诺塔。园盘从上到下编号1, 2, ..., n,杆子从左至右A,B,C,A是from,C是to。我还是看了以前的java程序然后自己理解一下写的C程序,几乎没有差别,当然写的时候也忘了不少,第一遍出来错误的答案。程序如下:
  1. #include <stdio.h>
  2. #define INIT_NUM 3
  3. int count;
  4. void hanoi(int n, char from, char to, char middle)
  5. {
  6.     if (n > 0)
  7.     {
  8.         count++;
  9.         hanoi(n-1, from, middle, to);
  10.         printf("Move No.%-2d from %c to %c/n", n, from, to);
  11.         hanoi(n-1, middle, to, from);
  12.     }
  13. }
  14. int main(int argc, char *argv[])
  15. {
  16.     int init = INIT_NUM;
  17.     if (argc==2)
  18.         init = atoi(argv[1]);
  19.     printf("A 是起始杆,C 是辅助杆,B 是目的杆。/n/n");
  20.     hanoi(init, 'A''C' , 'B');
  21.     printf("/nCount = %d", count);
  22.     return 0;
  23. }

借着这股东风,我再顺便写一下排序的算法实现,我只记得冒泡跟快速排序了,现在先写一个冒泡排序吧:
  1. #include <stdio.h>
  2. void show (int *p)
  3. {
  4.     int i=0;
  5.     for (i=0 ;i<8 ;i++ )
  6.     {
  7.         printf("%3d ", p[i]);
  8.     }
  9.     printf("/n");
  10. }
  11. int main(int argc, char *argv[])
  12. {
  13.     int p[] = {8, 9, 4, 5, 1, 7, 6, 0};
  14.     int i   = 0;
  15.     int j   = 0;
  16.     int tmp = 0;
  17.     for (i=0 ;i<8 ;i++ )
  18.     {
  19.         for (j=0 ;j<7-i ;j++ )
  20.         {
  21.             if (p[j] > p[j+1])
  22.             {
  23.                 tmp    = p[j];
  24.                 p[j]   = p[j+1];
  25.                 p[j+1] = tmp;
  26.             }
  27.         }
  28.         printf("第%2d轮排序结束:", i+1);
  29.         show(p);
  30.     }
  31.     
  32.     return 0;
  33. }



原创粉丝点击