uva 10795 - A Different Task(递归)

题目大意:就是普通的汉诺塔问题,给出n,表示说有n个大小不同的碟子,然后再给出每个碟子的初始位置和目标位置,要求计算出最少的步数使得每个碟子都移动到它的目标位置。


解题思路:找到需要移动的最大碟子i,然后1~i-1个碟子需要移动到6 - now[i] - end[i],同样的需要让i - 1移动到6 - now[i] - end[i],需要让1~i - 2都移动到 6 - (6 - now[i] - end[i])- now[i - 1],所以很明显是递归求解,注意要将1~i - 2移动到i - 1上面。


然后进行完上述操作,从1~i-1都在同一个柱子上,可以从大到小将每个碟子还原到目标位置。

#include <cstdio>

long long f(int *p, int i, int Final) {
	if (i == 0) 
		return 0;
	if (p[i] == Final)
		return f(p, i-1, Final);
	return f(p, i-1, 6-p[i]-Final) + (1LL << (i-1));
}

int main() {
	int kase = 0, n, start[70], finish[70];
	while (scanf("%d", &n), n) {
		for (int i = 1; i <= n; i++)
			scanf("%d", &start[i]);
		for (int i = 1; i <= n; i++)
			scanf("%d", &finish[i]);
		int k = n;
		while (k >= 1 && start[k] == finish[k]) 
			k--;

		long long ans = 0;
		if (k >= 1) {
			int other = 6 - start[k] - finish[k];
			ans =  f(start, k-1, other) + f(finish, k-1, other) + 1;
		}
		printf("Case %d: %lld\n", ++kase, ans);
	}
	return 0;
}


你可能感兴趣的:(uva 10795 - A Different Task(递归))