uva 1414 - Hanoi Towers(dp)

题目连接:uva 1414 - Hanoi Towers


题目大意:给出n,表示说有n个碟子,有三根柱子,进行汉诺塔游戏,不过不同的是说,移动碟子必须按照给出的顺序,如果可以移动,则必须移动当前的碟子到指定位置(所谓不能移动是因为其他位置上的碟子比当前位置上的要小);并且不能连续移动同一个碟子两次。


解题思路:因为移动顺序被限制死了,所以移动的方案是固定的,而且除了最小的碟子以外,所有碟子都会被比自己小的碟子限制住,而且如果前一次不是移动最小的碟子,那么当前一定会移动最小的碟子。并且说最小的碟子移动到哪一个柱子,就会决定说下一个碟子必须移动到哪里,没有的选,也不需要考虑顺序。

所以我们只需要考虑最小碟子的移动的顺序即可

1)A -> B/C ->C/B ->A    x = 2,y=1

2)  A -> B/C -> A              x =3, y=2

3)  A ->B/C ->C/B ->B/C  x=3,y=0

然后dp[i] = dp[i-1]*x + y。


#include <stdio.h>
#include <string.h>

const int N = 50;
typedef long long ll;

int n;
ll x, y, dp[N];

inline void init () {
	int v[5];
	char s[5];
	memset(v, 0, sizeof(v));

	for (int i = 0; i < 6; i++) {
		scanf("%s", s);
		int u = s[0] - 'A' + 1;
		int k = s[1] - 'A' + 1;

		if (v[u]) continue;

		v[u] = k;
	}

	if (v[2] != 1 && v[3] != 1) {
		x = 3; y = 0;
	} else if (v[v[1]] == 1) {
		x = 3; y = 2;
	} else {
		x = 2; y = 1;
	}
}

int main () {
	while (scanf("%d", &n) == 1) {
		init ();
		dp[1] = 1;
		for (int i = 2; i <= n; i++)
			dp[i] = dp[i-1] * x + y;
		printf("%lld\n", dp[n]);
	}
	return 0;
}


你可能感兴趣的:(uva 1414 - Hanoi Towers(dp))