题解 | #循环汉诺塔#

循环汉诺塔

https://www.nowcoder.com/practice/cdf0808f841748faba058c8ef538c731

#include<iostream>
#include<vector>

using namespace std;
// 以下是@Muuuuuuu的解题思想,仅做借鉴学习*****************
//根据题目规定,易知该情况下,只有底部,没有顶部,从A移动到B需要1次操作(A→B),从A移动到C需要2次操作(A→B,B→C)。

//设函数AB(N)为把N个盘从A移动到B需要操作的次数,函数AC(N)为把N个盘从A移动到C需要操作的次数。

// 因此我们可以记为当N=1时,AB(1)=1,AC(1)=2。
//A移动到B时
/*首先需要把顶部从A移到C,再把底部从A移到B,最后把顶部从C移到B。

一共会有5次操作,即1、A→B,2、B→C,3、A→B,4、C→A,5、A→B。

实际上,AB(N)可以视为是由3个子问题组成的,即1、顶部移动两次,2、底部移动一次,3、顶部移动两次;

子问题1实际上是AC(N-1)的问题;

子问题2由于底部只有一个盘,所以子问题2的值恒等于AB(1),即值为1;

子问题3实际上也是AC(N-1)的问题;

所以AB(N)=AC(N-1)+1+AC(N-1)

简化一下,AB(N)=2AC(N-1)+1*/

/*A移动到C时:
首先将顶部从A移到C,再将底部从A移到B,再将顶部从C移到A,再将底部从B移到C,最后将顶部从A移到C。

一共有7次操作,即:1、A→B,2、B→C,3、A→B,4、C→A,5、B→C,6、A→B,7、B→C。

同样的,AC(N)也可以视为由5个子问题组成,即:1、顶部移动两次,2、底部移动一次,3、顶部移动一次,

4、底部移动一次,5、顶部移动两次;

子问题1实际上是AC(N-1)的问题;

子问题2由于底部只有一个盘,所以子问题2的值恒等于AB(1),即值为1;

子问题3实际上是AB(N-1)的问题;

子问题4也是值恒为1;

子问题5实际上也是AC(N-1)的问题;

所以AC(N)=AC(N-1)+1+AB(N-1)+1+AC(N-1)

简化一下,AC(N)=2AC(N-1)+AB(N-1)+2*/

void RecurHanoi(int index, int n, vector<long long int> &AB, vector<long long int> &AC){
    //index = 2 初始化使用该函数
    // AB[1] = 1, AC[1] = 2;
    if(index > n){
        return;
    }
    // AB[n] = 2*AC[n-1] + 1
    // AC[n] = 2*AC[n-1] + AB[n-1] + 2
    // 这里注意要先取模,要不会数据太大,会出现负数
    AB[index] = (2*AC[index-1] + 1)%1000000007;
    AC[index] = (2*AC[index-1] + AB[index-1]  + 2)%1000000007;
    index++;
    RecurHanoi(index, n, AB, AC);
}

int main(){
    int n = 0;
    cin >> n;
    int id = 2;
    vector<long long int> AB(n+1, 1);
    vector<long long int> AC(n+1, 2);
    RecurHanoi(id, n, AB, AC);
    cout << AB[n] << ' ' << AC[n] << endl;
    return 0;
}

#解题#
全部评论

相关推荐

双飞二本嵌入式求拷打我是在&nbsp;BOSS&nbsp;上投递的简历,好多都没人回复,这是开场白和简历求大神帮忙看看。您好!我是2025届应届生,最快可在一周内上岗,能够实习六个月以上,并接受加班。以下是我的核心优势和相关经验:1.&nbsp;嵌入式开发能力:&nbsp;&nbsp;&nbsp;熟练掌握STM32系列单片机及其外设(如GPIO、定时器、ADC、DAC、I2C、SPI、UART等),能够独立完成硬件驱动开发和调试。&nbsp;&nbsp;熟悉FreeRTOS实时操作系统,具备多任务调度和资源管理经验。&nbsp;&nbsp;熟悉LVGL图形库开发,能够实现嵌入式设备的图形界面设计。2.&nbsp;硬件设计能力:&nbsp;&nbsp;&nbsp;具备PCB设计经验,曾为2023年工创赛物流搬运赛道设计小车主板,带领团队获得国家级银奖。&nbsp;&nbsp;&nbsp;熟悉硬件原理图分析,能够快速理解并调试硬件电路。3.&nbsp;机器人开发与竞赛经验:&nbsp;&nbsp;&nbsp;在全国大学生智能车竞赛、ROS机器人竞赛中多次获得国家级奖项,具备丰富的机器人开发经验。&nbsp;&nbsp;&nbsp;熟悉Linux环境,对ROS和ROS&nbsp;2有一定了解,能够进行机器人系统的开发与调试。4.&nbsp;编程能力:&nbsp;&nbsp;&nbsp;熟悉C/C++,熟悉Python,能够高效完成嵌入式开发和算法实现。&nbsp;&nbsp;&nbsp;具备良好的代码规范和文档编写能力。5.&nbsp;团队协作与领导能力:&nbsp;&nbsp;&nbsp;在多个项目中担任核心开发或团队负责人,具备良好的沟通能力和团队协作精神。&nbsp;&nbsp;&nbsp;在工创赛中带领团队完成项目规划、任务分配和技术攻关,展现了较强的领导力。我对嵌入式开发、机器人技术和智能硬件充满热情,期待加入贵公司,与团队共同成长,为公司创造价值!如果有合适的岗位,欢迎随时联系我,期待进一步沟通!
沉淀一会:嵌入式就是狗屎
点赞 评论 收藏
分享
评论
1
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务