汉诺塔问题:有三根相邻的柱子,标号为A、B、C,A柱子上从下到上按金字塔状叠放着n个不同大小的圆盘,要把所有盘子一个一个移动到柱子B上,并且每次移动同一根柱子上都不能出现大盘子在小盘子上方。
利用递归算法完成该汉诺塔算法,并输出n个圆盘搬动的次序。
#include<stdio.h>
void Hanoi(int n, char x, char y, char z)
{
if (n == 1)
printf("%c->%c\n", x, z); //一个圆盘
else
{
Hanoi(n - 1, x, z, y); //将A柱上n-1个圆盘借助C柱移动到B柱
printf("%c->%c\n", x, z); //最大的盘放入C柱
Hanoi(n - 1, y, x, z); //将B柱上n-1个圆盘借助A柱移动到C柱
}
}
int fun(int n)
{
int sum = 1;
for (n - 1; n > 0; n--) //计算2的n次方
sum = sum * 2;
return sum;
}
int main()
{
int n;
char x = 'A';
char y = 'B';
char z = 'C';
printf("输入圆盘个数:");
scanf_s("%d", &n);
Hanoi(n, 'A', 'B', 'C');
printf("%d个圆盘搬动次序:%d", n, (fun(n) - 1));
}
运行结果
利用非递归算法完成该汉诺塔算法,并输出n个圆盘搬动的次序。
#include<stdio.h> #include<stdlib.h> #define Maxsize 100 typedef struct { int N; //盘子数 char a; //起始柱 char b; //辅助柱 char c; //目标住 }ElemType; //汉诺塔问题结构类型 typedef struct { ElemType data[Maxsize]; int top; }Stack; //初始化栈 void Initstack(Stack*& s) { s = (Stack*)malloc(sizeof(Stack)); if (s == NULL) { return; //判断指针不为空 } s->top = -1; } //销毁栈 void DestoryStsck(Stack*& s) { free(s); } //入栈 void Push(Stack *&s, ElemType e) { if (s->top == Maxsize) { printf("The Stack is full!\n"); return; } s->top++; //栈顶指针+1 s->data[s->top] = e; //元素e储存在栈顶指针处 return; } //出栈 ElemType Pop(Stack *&s) { //判断栈是否为空 if (s->top == -1) { printf("The Stack is empty!\n"); exit(1); //终止程序 } s->top--; return (s->data[s->top+1]); } //汉诺塔借助栈的非递归实现 void Hanoi(int n) { ElemType p, k; Stack *st; int j=1; p.N = n; p.a = 'A'; p.b = 'B'; p.c = 'C'; //初始化栈 Initstack(st); //问题入栈 Push(st, p); //当栈顶不为空 while (st->top != -1) { p=Pop(st); //出栈 //n=1,直接移动盘子 if (p.N == 1) { printf("%d.%c->%c\n",j++, p.a, p.c); } else { //栈后进先出,倒着写 //第三步(n-1,b,a,c) k.N = p.N - 1; k.a = p.b; k.b = p.a; k.c = p.c; Push(st, k); // 第二步(1,a,b,c) k.N = 1; k.a = p.a; k.b = p.b; k.c = p.c; Push(st, k); //第一步(n-1,a,c,b) k.N = p.N - 1; k.a = p.a; k.b = p.c; k.c = p.b; Push(st, k); } } printf("%d个圆盘搬动次序:%d\n", n, j-1); DestoryStsck(st); } int main() { int n; printf("输入n:"); scanf_s("%d", &n); if (n <= 0) { printf("输入错误\n"); return 0; } else Hanoi(n); }
运行结果