清华大学程序设计课件-------第4章.pptVIP

  • 9
  • 0
  • 约1.56万字
  • 约 93页
  • 2017-07-02 发布于湖北
  • 举报
清华大学程序设计课件-------第4章

汉诺塔演示 问题分析 待解决的问题 Q1:是否存在某种简单情形,问题很容易解决 Q2:是否可将原始问题分解成性质相同但规模较小的子问题,且新问题的解答对原始问题有关键意义 解答方案 A1:只有一个圆盘时是最简单情形 A2:对于 n 1,考虑 n – 1 个圆盘,如果能将 n - 1 个圆盘移动到某个塔座上,则可以移动第 n 个圆盘 策略:首先将 n – 1 个圆盘移动到塔座 Y 上,然后将第 n 个圆盘移动到 Z 上,最后再将 n - 1 个圆盘从 Y 上移动到 Z 上 递 归 Hanoi 塔问题的递归思想 伪代码 void MoveHanoi(unsigned int n, HANOI from, HANOI tmp, HANOI to) { if( n == 1 ) 将一个圆盘从 from 移动到 to else { 将 n – 1 个圆盘从 from 以 to 为中转移动到 tmp 将圆盘 n 从 from 移动到 to 将 n - 1个圆盘从 tmp 以 from 为中转移动到 to } } from tmp to n-1 程序代码 #include stdio.h #include “zylib.h” /* 枚举类型 HANOI,其文字分别表示三个圆柱的代号 */ typedef enum {X, Y, Z} HANOI; void PrintWelcomeInfo(); unsigned int GetInteger( STRING prompt ); void MoveHanoi( unsigned int n, HANOI from, HANOI tmp, HANOI to ); STRING ConvertHanoiToString( HANOI x ); void MovePlate( unsigned int n, HANOI from, HANOI to ); int main() { unsigned int n; PrintWelcomeInfo(); n = GetInteger( Input number of plates: ); MoveHanoi( n, X, Y, Z ); return 0; } void PrintWelcomeInfo() { printf( The program shows the moving process of Hanoi Tower.\n ); } unsigned int GetInteger( STRING prompt ) { unsigned int t; printf( prompt ); t = GetIntegerFromKeyboard(); return t; } STRING ConvertHanoiToString( HANOI x ) { switch( x ) { case X: return X; case Y: return Y; case Z: return Z; default: return Error; } } void MovePlate( unsigned int n, HANOI from, HANOI to ) { STRING from_str, to_str; from_str = ConvertHanoiToString( from ); to_str = ConvertHanoiToString( to ); printf( %d: %s -- %s\n, n, from_str, to_str ); } void MoveHanoi(unsigned int n,HANOI from,HANOI tmp,HANOI to) { if( n == 1 ) MovePlate( n, from, to ); else{ MoveHanoi( n - 1, from, to, tmp ); MovePlate( n, from, to ); MoveHanoi( n - 1, tmp, from, to ); } } n的含义? n的含义? #include stdio.h int step=0; void move( char, char ); void MoveHanoiTower( int, char, char, char ); int main() { int n; printf(please input n=); scanf(%d, n); MoveHa

文档评论(0)

1亿VIP精品文档

相关文档