递归之汉诺塔问题
来源:互联网 发布:网络综艺节目收视率 编辑:程序博客网 时间:2024/05/17 00:08
汉诺塔问题的圆盘的最大数量为64,
#include <stdio.h>#include <stdlib.h>#define N 10int a[N][3]={0};//全局数组,因为每个函数都要用这个数组void show(int a[N][3]);//显示的作用void hanno(int n,char A,char B,char C);//移动的过程就是模型modelvoid move(char X,char Y);//算法和图形化的链接,汉诺塔每一个移动都传输到数据中,再显示出来。这里的数据就是a数组。这里就是将hanno和show链接起来了。这里就是controlvoid show(int a[N][3])//显示{ printf("%5c%5c%5c\n",'A','B','C'); printf("---------------------------\n"); for (int i=0;i<N;i++) { for (int j=0;j<3;j++) { printf("%5d",a[i][j]); } printf("\n"); }}void hanno(int n,char A,char B,char C)//模型{ if(n<1) { return; } else if(n==1) { printf("\n%c->%c",A,C); move(A,C);//相当于control show(a);//相当于view }else { hanno(n-1,A,C,B); printf("\n%c->%c",A,C); move(A,C); show(a); hanno(n-1,B,A,C);}}void move(char X,char Y)//control{ int m=X-65; int n=Y-65; int imove=-1; for (int i=0;i<N;i++) { if(a[i][m]!=0) { imove=i; break; } } int jmove; if(a[N-1][n]==0) { jmove=N-1; } else { jmove=N; for(int i=0;i<N;i++) { if(a[i][n]!=0) { jmove=i; break; } } jmove-=1; } int temp=a[imove][m]; a[imove][m]=a[jmove][n]; a[jmove][n]=temp;}int main(){ int n=0; scanf("%d",&n); for (int i=0;i<n;i++) { a[N-1-i][0]=n-i; } show(a); hanno(n,'A','B','C'); return 0;}
运行结果:
输入为4,则结果为
A B C
0 0 00 0 00 0 00 0 00 0 00 0 01 0 02 0 03 0 04 0 0
A->B A B C
0 0 00 0 00 0 00 0 00 0 00 0 00 0 02 0 03 0 04 1 0
A->C A B C
0 0 00 0 00 0 00 0 00 0 00 0 00 0 00 0 03 0 04 1 2
B->C A B C
0 0 00 0 00 0 00 0 00 0 00 0 00 0 00 0 03 0 14 0 2
A->B A B C
0 0 00 0 00 0 00 0 00 0 00 0 00 0 00 0 00 0 14 3 2
C->A A B C
0 0 00 0 00 0 00 0 00 0 00 0 00 0 00 0 01 0 04 3 2
C->B A B C
0 0 00 0 00 0 00 0 00 0 00 0 00 0 00 0 01 2 04 3 0
A->B A B C
0 0 00 0 00 0 00 0 00 0 00 0 00 0 00 1 00 2 04 3 0
A->C A B C
0 0 00 0 00 0 00 0 00 0 00 0 00 0 00 1 00 2 00 3 4
B->C A B C
0 0 00 0 00 0 00 0 00 0 00 0 00 0 00 0 00 2 10 3 4
B->A A B C
0 0 00 0 00 0 00 0 00 0 00 0 00 0 00 0 00 0 12 3 4
C->A A B C
0 0 00 0 00 0 00 0 00 0 00 0 00 0 00 0 01 0 02 3 4
B->C A B C
0 0 00 0 00 0 00 0 00 0 00 0 00 0 00 0 01 0 32 0 4
A->B A B C
0 0 00 0 00 0 00 0 00 0 00 0 00 0 00 0 00 0 32 1 4
A->C A B C
0 0 00 0 00 0 00 0 00 0 00 0 00 0 00 0 20 0 30 1 4
B->C A B C
0 0 00 0 00 0 00 0 00 0 00 0 00 0 10 0 20 0 30 0 4
由上图可知,1,2,3,4代表大盘小盘,也就是盘子的大小。A,B,C代表三个柱子。编程过程中要注意算法和图形化的链接。对于地图等的设计也是一样的,都是先用一种数据结构比如数组等将数据存储器起来,然后再show出来。
汉诺塔问题是一个树状的递归。递归分为树状递归和线性递归。
MVC的设计模式,也就是model,view以及control。
0 0
- 递归问题之汉诺塔
- 递归问题之汉诺塔
- 递归之汉诺塔问题
- 递归之汉诺塔问题
- 递归之汉诺塔问题
- 递归之汉诺塔问题
- 汉诺塔问题之递归解法
- 递归小问题之汉诺塔
- 汉诺塔问题 递归之美
- 递归算法之汉诺塔问题
- 递归算法之汉诺塔问题
- 河内之塔(汉诺塔问题--------递归
- 数据结构学习之递归求解汉诺塔问题
- 递归的力量之汉诺塔问题
- 算法学习之递归--汉诺塔问题
- 递归之台阶问题
- 递归问题之兔生兔
- 递归之排列问题
- Spring AOP的一些基础知识
- RAID详解
- GPS信噪比解析
- iOS多线程开发其实很简单
- 滚动条最底部设置
- 递归之汉诺塔问题
- 使用java jacob转换office到pdf
- Tomcat 的热部署和加载
- Linux设备驱动程序(LDD)第二章:Hello World模块
- 3. Inversion of Control (IoC)
- rdiff-backup:一个 Linux 中的远程增量备份工具
- 【Linux学习】Linux文件和目录管理
- 互斥锁mutex的使用方法
- hadoop2.7.2学习笔记05-hadoop文件系统API定义-本文档使用到的专用符号