汉诺塔绝对是一个经典的算法题目,虽然当年也讲过,程序也不长,但是一直以来总觉得理解的不清楚,看程序也能明白什么意思,过一段时间程序忘了,想不起来的时候,就怎么都想不明白了,虽然说好像是那么回事,就是高不明白。借着前两天做八皇后的东风,顺便来理一下这个汉诺塔。园盘从上到下编号1, 2, ..., n,杆子从左至右A,B,C,A是from,C是to。我还是看了以前的java程序然后自己理解一下写的C程序,几乎没有差别,当然写的时候也忘了不少,第一遍出来错误的答案。程序如下:
#include <stdio.h>#define INIT_NUM 3int 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;}
借着这股东风,我再顺便写一下排序的算法实现,我只记得冒泡跟快速排序了,现在先写一个冒泡排序吧:
#include <stdio.h>void show (
int *p){
int i=0;
for (i=0 ;i<8 ;i++ ) { printf(
"= ", 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(
"第-轮排序结束:", i+1); show(p); }
return 0;}