汉诺塔--非递归--规律发现解答

当确定盘数为n时,它所需要进行操作的次数就确定为2^n-1

当n是偶数时
1)奇数步骤一定有a->b,b->c,c->a,a->b的重复顺序输出
2)偶数步骤一定有固定的7对序对输出顺序,为
a->c,a->b,c->b,a->c,b->a,b->c,a->c

当n是奇数时
1)奇数步骤一定有a->c,c->b,b->a,a->c的重复顺序输出
2)步骤为2,2+4,2+4+4…一定有a->b,b->c,c->a,a->b的重复顺序输出
3)步骤为4的倍数时一定有7个对固定输出顺序,为
a->c,a->b,c->b,a->c,b->a,b->c,a->c

代码实现

#include<stdio.h>
#include<math.h>

void Oushu(int n){
    char begin[7]={'a','a','c','a','b','b','a'};
    char end[7]={'c','b','b','c','a','c','c'};
    char first='a';
    int mark=0;
    for(int i=1; i<=n; i++){
        if(i%2!=0){
            if(first+1=='d'){
                printf("c -> a\n");
                first='a';
            }else{
                printf("%c -> %c\n",first,first+1);
                first++;
            }
        }else{
            printf("%c -> %c\n",begin[mark],end[mark]);
            mark++;
            if(mark==7){
                mark=0;
            }
        }
    }
}

void Jishu(int n){
    char begin[7]={'a','a','c','a','b','b','a'};
    char end[7]={'c','b','b','c','a','c','c'};
    char first='a',seconed='a',third='a';
    int contr=2;
    int mark=0;
    for(int i=1; i<=n; i++){
        if(i%2!=0){
            if(first=='a'){
                printf("%c -> %c\n",first,first+2);
                first='c';
            }else{
                printf("%c -> %c\n",first,first-1);
                first--;
            }
        }else if(i==contr){
            contr+=4;
            if(seconed+1=='d'){
                printf("c -> a\n");
                seconed='a';
            }else{
                printf("%c -> %c\n",seconed,seconed+1);
                seconed++;
            }
        }else{
            printf("%c -> %c\n",begin[mark],end[mark]);
            mark++;
            if(mark==7){
                mark=0;
            }
        }
    }
}

int main(){
    int n;
    scanf("%d",&n);
    int temp=n;
    n=pow(2,n)-1;
    if(temp%2==0){
        Oushu(n);
    }else{
        Jishu(n);
    }
    return 0;
}

注意:该代码用int类型进行计算循环次数,但int范围不够,所以可测数据有限,这里只是提供这个规律。。。。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值