汉诺塔非递归算法c语言,史上最牛逼的汉诺塔非递归算法

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼

#include

#include

main()

{

int a,b,c,d,p,n=44,i,k;

//a,b,c,d作为123交换用 ,n为盘数

//p表示总步数,i为往上回朔的次数,k为这个盘子的位置很重要

for(p=1;p<=pow(2,n)-1;p++){

k=p;

a=1;

b=2;

c=3;

// 向上回朔的循环

for(i=1;i<=n-1;i++){

//作变换

switch(k%4){

case 3:

d=b;

b=a;

a=d;

break;

case 1:

d=c;

c=b;

b=d;

break;

default:

break;

}

k=k/2+k%4%3%2; //向上一次位子的变换

}

// 打印有些麻烦 要打印是1的字母到是3的字母

if(a==1){

if(b==2)

printf("a-c\t");

else

printf("a-b\t");

}

else{

if(a==2){

if(b==3)

printf("c-b\t");

else

printf("b-c\t");

}

else{

if(b==1)

printf("b-a\t");

else

printf("c-a\t");

}

}

}

return 0;

}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
汉诺塔是一个经典的递归问题,但也可以使用非递归算法来解决。下面是一个使用C语言实现的非递归算法: ```c #include <stdio.h> #include <stdlib.h> typedef struct { int n; char source, temp, dest; } State; typedef struct { State *array; int size; int top; } Stack; Stack *createStack(int size) { Stack *stack = (Stack *) malloc(sizeof(Stack)); stack->array = (State *) malloc(sizeof(State) * size); stack->size = size; stack->top = -1; return stack; } void push(Stack *stack, State state) { stack->array[++stack->top] = state; } State pop(Stack *stack) { return stack->array[stack->top--]; } void hanoi(int n, char source, char temp, char dest) { Stack *stack = createStack(n); push(stack, (State) {n, source, temp, dest}); while (stack->top >= 0) { State currentState = pop(stack); if (currentState.n == 1) { printf("Move disk from %c to %c\n", currentState.source, currentState.dest); } else { push(stack, (State) {currentState.n - 1, currentState.temp, currentState.source, currentState.dest}); push(stack, (State) {1, currentState.source, currentState.temp, currentState.dest}); push(stack, (State) {currentState.n - 1, currentState.source, currentState.dest, currentState.temp}); } } free(stack->array); free(stack); } int main() { int n; printf("Enter the number of disks: "); scanf("%d", &n); hanoi(n, 'A', 'B', 'C'); return 0; } ``` 这个算法使用了一个栈来模拟递归的过程。首先将初始状态压入栈中,然后在每一次循环中取出栈顶状态进行处理。当只有一个盘子时,直接移动即可,否则将分解成三个子问题,分别将n-1个盘子从源柱移动到辅助柱,将最后一个盘子从源柱移动到目标柱,最后将n-1个盘子从辅助柱移动到目标柱。循环直到栈为空,即所有盘子都移动到了目标柱。 示例代码中的hanoi函数接受三个参数:n表示盘子的个数,source表示源柱,temp表示辅助柱,dest表示目标柱。在每一次移动盘子时,会打印出移动的步骤。 你可以在程序中输入想要的盘子数量,然后运行该程序来查看非递归算法的结果。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值