n阶汉诺塔问题
来源:互联网 发布:网上接软件项目 编辑:程序博客网 时间:2024/06/03 20:24
问题描述:
问题分析:
元素只能在一端进行操作,因而选择栈数据结构。复杂问题可以分而治之,不断递归可解决问题。
递归基:当X上只有一个圆盘时,可直接移动到Z;
递归分解:当X上有n个圆盘时,可先将n-1个圆盘移动到Y,Z作为辅助盘;再将X上n盘移动到Z;最后将Y上n-1个盘移动到Z,X作为辅助盘。
代码实现
#include <stdio.h> #include <stdlib.h> //宏定义 #define OVERFLOW -1 #define STACKEMPTY -2 typedef int ElemType;//栈节点typedef struct LNode{ElemType data;LNode *next;}LNode, *LinkList;typedef struct stack{LinkList top;}STACK;/* 栈相关接口* */void InitStack(STACK &S);void Push(STACK &S, ElemType e);void Pop(STACK &S, ElemType *e);ElemType GetTop(STACK S, ElemType *e);int StackEmpty(STACK S);//初始化栈void InitStack(STACK &S){S.top = NULL;}//入栈void Push(STACK &S, ElemType e){LinkList p;p = (LinkList)malloc(sizeof(LNode));if (!p) exit(OVERFLOW);p->data = e;p->next = S.top;S.top = p;}//出栈void Pop(STACK &S, ElemType *e){LinkList p;if (StackEmpty(S)) exit(STACKEMPTY);*e = S.top->data;p = S.top;S.top = p->next;free(p);}//获取栈顶元素ElemType GetTop(STACK S, ElemType *e){if (StackEmpty(S)) exit(STACKEMPTY);*e = S.top->data;}//输出栈void printStack(STACK S){LinkList p;p = S.top;printf("栈: ");while (p) {printf("%d ", p->data);p = p->next;}printf("\n");}//判空int StackEmpty(STACK S){return S.top == NULL;}/* 解题思路* 如果有一个盘子,直接从X移到Z即可。* 如果有n个盘子要从X移到Z,Y作为辅助。问题可以转化为,先将上面n-1个从X移动到Y,Z作为辅助,然 后将第n个从X移动到Z,最后将剩余的n-1个从Y移动到Z,X作为辅助。*///将A栈顶元素移动到B栈顶void move(STACK &Sa, STACK &Sb){ElemType e;Pop(Sa, &e);Push(Sb, e);}//将塔座X上n个圆盘移到塔座Z,Y做辅助塔 void hanoi(int n, STACK &X, STACK &Y, STACK &Z){if (n == 1){move(X, Z); //将塔座X上圆盘直接移到塔座Z return;}hanoi(n - 1, X, Z, Y); //将塔座X上n-1个圆盘移到塔座Y,Z做辅助塔 move(X, Z); //将塔座X上圆盘直接移到塔座Zhanoi(n - 1, Y, X, Z); //将塔座Y上n-1个圆盘移到塔座Z,X做辅助塔 }//测试int main(void){STACK Sx, Sy, Sz;InitStack(Sx);InitStack(Sy);InitStack(Sz);int i, n = 20;for (i = 20; i >= 1; i--) {Push(Sx, i);}printStack(Sx);hanoi(n, Sx, Sy, Sz);printStack(Sz);return 0;}
from:http://blog.csdn.net/hguisu/article/details/7674195
0 0
- n阶汉诺塔问题
- N*N皇后问题
- hdu1061-N*N问题
- N!问题
- N!问题
- n×n棋盘上n皇后问题
- n*n网格路径问题
- n++和++n堆栈问题
- 问题六十三:对于任何正整数n,求1+n+n*n+n*n*n。
- N皇后问题
- SELECT TOP N 问题
- n后问题
- n皇后问题
- oracle top n 问题
- oracle top n 问题
- N皇后问题
- N 皇后问题
- 【sql】n+1问题
- 23:大盗阿福
- scp命令
- web.xml中<async-supported>报错异常
- Talented Chef ZOJ
- 使用DBUtiles简化JDBC操作
- n阶汉诺塔问题
- 深夜切题——Codeforces Round #409 (rated, Div. 2, based on VK Cup 2017 Round 2)
- 关于图像的高斯模糊
- 数据结构(队列):循环队列
- 【JAVA技术库】分页模糊查询
- UNIX系统安装RabbitMQ服务器过程及安装过程中遇到的问题
- 数据结构(队列):队列的链式存储结构
- LeetCode-52. N-Queens II (JAVA)(N皇后解集个数)
- java图片处理---Javax.imageIO包的用法