四盘汉诺塔

题意

在传统的汉诺塔游戏中多加了一个盘子。
问把n层的汉诺塔从第一个盘子移到第四个盘子需要多少步?

思路

重温经典汉诺塔

要将n层从1号盘移动到3号盘,需要分为三步:
1:把n-1层从1号移动到2号(n层要移动到3号,为了不影响n层的移动只能移动到2号)
2:把n层从1移动到3号
3:把n-1层从2号移到3号

把第一个步骤又能细分成类似的三步

直到当前移动的总层数为1,只需要一步,递归。

所以经典汉诺塔游戏中,n层最小移动步数为
d[n] = d[n-1] + 1 + d[n-1]
d[1] = 1

四盘汉诺塔

经典汉诺塔有三个盘装塔,在一次移动中,除了起始盘,只有两个盘可以用于操作,所以
可以把经典n层诺贝塔的答案理解成:
在有两个空位的情况下,移动一次n层塔需要的步数为d[n]。

那么在四盘汉诺塔游戏中,可以有三个空闲盘用于操作。
需要移动n层哈诺塔时,可以把上面的i层移动到一个空盘中,剩下两个空盘。
在剩下两个空盘中移动n-i层,显然为d[n-1]
所以四盘汉诺塔,n层的最小移动步数为
f[n] = f[i] + d[n-i] + f[i]
f[1] = 1

ac源码

#include<bits/stdc++.h>
using namespace std;
#define ull unsigned long long
const int maxn = 15;

int d[maxn];
int f[maxn];

int main(){
    
    
	d[1] = 1;
	for(int i = 2 ; i <= 12 ; i++){
    
    
		d[i] = d[i-1]*2 + 1;
		f[i] = 1000000000;
	}

	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;

}

猜你喜欢

转载自blog.csdn.net/qq_35068676/article/details/108902485
今日推荐