acgo题库
  • 首页
  • 题库
  • 学习
  • 竞赛
  • 讨论
  • 排行
  • 团队
  • 备赛专区

    竞赛

    • CSP-J/S
    • 蓝桥杯

    考级

    • GESP
    • CPA
    • 电子学会考级
登录
注册
题目详情提交记录(0)
  • 题解·Hanoi 双塔问题

    #include<bits/stdc++.h> using namespace std; #define N 105 void setLen(int a[], int i) { while(a[i] == 0 && i > 1) i--; a[0] = i; } void Multiply(int a[], int b, int r[])//高精乘低精 r = a * b { int c = 0, i; for(i = 1; i <= a[0]; i) { r[i] = a[i] * b + c; c = r[i] / 10; r[i] %= 10; } while(c > 0) { r[i] = c % 10; c /= 10; i; } setLen(r, i); } void Add(int a[], int b)//高精加低精 a += b { int c = b, i = 1; while(c > 0) { a[i] += c; c = a[i] / 10; a[i] %= 10; i++; } if(i > a[0]) setLen(a, i); } void showNum(int a[]) { for(int i = a[0]; i >= 1; --i) cout << a[i]; } int main() { int n, a[205][N] = {};//a[i]:2i层汉诺塔从A移动到C的步数 cin >> n; a[1][0] = 1, a[1][1] = 2;//a[1] = 2; for(int i = 2; i <= n; ++i) { Multiply(a[i-1], 2, a[i]);//a[i] = 2a[i-1]; Add(a[i], 2);//a[i] += 2 } showNum(a[n]); return 0; }

    userId_undefined

    ≥~≤

    出道萌新秩序白银
    30阅读
    0回复
    2点赞
  • 题解

    我们通过实践发现,由于两个相同圆盘可以反着放,所以实际上的步数就是普通汉诺塔步数的两倍. 而普通汉诺塔会消耗 2n−12^n-12n−1 步,所以答案就是 2(2n−1)2(2^n-1)2(2n−1). 秒了

    userId_undefined

    复仇者_帅童

    小有名气CSP-J一等奖出题人
    21阅读
    0回复
    0点赞
暂无数据

提交答案之后,这里将显示提交结果~

首页