96. 奇怪的汉诺塔递推
Posted 辉小歌
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了96. 奇怪的汉诺塔递推相关的知识,希望对你有一定的参考价值。
这是一道很经典的问题。
先看3个塔的情况
需要注意的是,这里的汉诺塔移动并无只可以移动到相邻塔的需求。即可以直接从A移到C。
设d[i]表示将i个盘子从这里移到其他除它之外塔的步数 ,总塔的数量为3
故d[i]=d[i-1]+d[i-1]+1 即将i-1个盘子移到B,将i号盘子移动C,再将i-1个盘子从B移到C
接下来分析4个塔的情况
设f[i]表示将i个盘子从这里移到其他除它之外塔的步数,总塔的数量为4
f[i]=min(f[i],f[j]+f[j]+d[i-j])
将j个盘子移到一个柱子,此时的j个盘子已经占了一个柱子,故剩余的i-j个盘子按照三个盘子的套路移动到D,再将j个盘子弄到D
这里都是f[j]是因为,移开的时候好分析,有三个柱子可以用,回来的时候因为我们排好的盘子在D柱子已经是大的盘子,故不影响还是f[j]
#include<bits/stdc++.h>
using namespace std;
const int N=15;
int f[N],d[N];
int main(void)
d[1]=1;
for(int i=2;i<=12;i++) d[i]=d[i-1]*2+1;
memset(f,0x3f,sizeof f);
f[1]=1;
for(int i=2;i<=12;i++)
for(int j=1;j<i;j++) f[i]=min(f[i],f[j]*2+d[i-j]);
for(int i=1;i<=12;i++) cout<<f[i]<<endl;
return 0;
以上是关于96. 奇怪的汉诺塔递推的主要内容,如果未能解决你的问题,请参考以下文章