汉诺塔绝对是一个经典的算法题目,虽然当年也讲过,程序也不长,但是一直以来总觉得理解的不清楚,看程序也能明白什么意思,过一段时间程序忘了,想不起来的时候,就怎么都想不明白了,虽然说好像是那么回事,就是高不明白。借着前两天做八皇后的东风,顺便来理一下这个汉诺塔。园盘从上到下编号1, 2, ..., n,杆子从左至右A,B,C,A是from,C是to。我还是看了以前的java程序然后自己理解一下写的C程序,几乎没有差别,当然写的时候也忘了不少,第一遍出来错误的答案。程序如下:0 V: i" y7 |5 d) |' h% h
#include 3 X( T9 |1 ^+ K7 ~3 I- C" ~2 \
#define INIT_NUM 3
+ B, l2 B$ z: w2 i3 b int count;
( u. d: S& q7 n5 F ]' q void hanoi(int n, char from, char to, char middle)
" c) e( r3 q, l5 | {* l7 R3 P7 _$ ^0 D! D7 [# n
if (n > 0)
2 }0 R7 S2 ~1 ^/ Z4 M y9 O& z {! \+ A/ ?3 L! P! y$ Q8 E+ m' x# K
count++;
2 E0 E. t- B- u: j* r, J hanoi(n-1, from, middle, to);# W3 p& f# N# U/ k& ^; U, i
printf("Move No.%-2d from %c to %c\n", n, from, to);2 B3 z" E& V1 p8 H3 U; L
hanoi(n-1, middle, to, from);- @ C2 P1 k3 }0 Z
}8 ]& j7 }5 d2 R, W0 z. w9 T# u
}
( p8 Q& h7 g4 p; V int main(int argc, char *argv[])* Z( k, y# V5 s9 A3 \% @0 ?: `& y- T9 [
{, t. H4 W2 y# [# J6 ~6 M
int init = INIT_NUM;
0 e5 h2 W7 ?" M. Q( F' X4 Z1 m if (argc==2)
7 f& y4 \# L' o7 |1 S init = atoi(argv[1]);
! ^9 K9 Z: X$ } printf("A 是起始杆,C 是辅助杆,B 是目的杆。\n\n");! @# }# ]" S! ?( D
hanoi(init, 'A', 'C' , 'B');! i6 R7 w. r, [/ l' q7 F
printf("\nCount = %d", count);
! [) S1 U; s0 A8 M2 [ return 0;. K) a) N* i' I' j
}/ S, D- `3 z& V* l
借着这股东风,我再顺便写一下排序的算法实现,我只记得冒泡跟快速排序了,现在先写一个冒泡排序吧:$ G' N `6 \ M
#include 5 N8 ^+ m# \, H
void show (int *p)
6 L8 W2 Y, U( B {# ?6 s5 S W8 p6 c) y, S. _
int i=0;
) W3 t4 v! o0 f. F4 R. ^* ^ for (i=0 ;i |