首页 > 其他分享 >『题解』UVA 10795 A Different Task

『题解』UVA 10795 A Different Task

时间:2022-11-26 21:56:50浏览次数:79  
标签:柱子 Different Task int 题解 start finish 汉诺塔 盘子

题目传送门

双倍经验Luogu P1242


分析

汉诺塔相信每一个合格的 OIer 都听说过并且实现过。这是一个递归的程序。

汉诺塔本来就有两个规则:

  1. 一次只能移动最上面的一个盘子。

  2. 编号大的盘子不能压在编号小的盘子上面。

汉诺塔问题给我们的结论就是下面这几句话:

把 \(n\) 个盘子的汉诺塔整体地从一根柱子移动到另一根柱子,
等价于把前 \(n-1\) 个盘子整体移动到中转柱子,
把第 \(n\) 个盘子移到那根柱子,把前 \(n-1\) 根柱子移动到那根柱子这三步加起来的和。

一句话:把 \(n\) 个盘子整体地移动到另一边,需要 \(2n - 1\) 步。证明就略过了。


所以新汉诺塔问题来了:已知初始盘子的状态和终止盘子的状态,求需要多少步才能转换。

我们是通过两个数组进行操作,一个叫 \(start\) 数组,表示初始状态每个盘子在哪根柱子上,即取值为 \([1,3]\),另一个叫 \(finish\) 数组,相似的定义。

有一个小结论:当目前编号最大的不在目标柱子上的盘子,是必须移动的。这是首要的矛盾。

所以我们应该找出如此的盘子,然后把它上面的盘子都移走,同时那根柱子上的盘子也要相应的挪开给大盘子腾出空间。


对于 UVA10795,蓝书里面用了可逆性来进行递推,有兴趣的直接翻看蓝书的讲解。其实真的讲得很好。

\(Code\)

#include<cstdio>

const int maxn = 65;
int start[maxn], finish[maxn];
int n;
long long move(int *arr, int k, int to)
{
	if(k == 0) return 0;
	if(arr[k] == to) return move(arr, k - 1, to);
	return move(arr, k - 1, 6 - arr[k] - to) + (1ll << (k - 1));// 这里本来有-1和+1,抵消了
}
int main()
{
	int kase = 0;
	while(scanf("%d", &n) == 1 && 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--;
		printf("Case %d: ", ++kase);
		if(k >= 1)
		{
			printf("%lld\n", move(start, k - 1, 6 - start[k] - finish[k]) + move(finish, k - 1, 6 - start[k] - finish[k]) + 1);
		}
		else printf("0\n");
	}
	return 0;
}

标签:柱子,Different,Task,int,题解,start,finish,汉诺塔,盘子
From: https://www.cnblogs.com/mrCrazyWolf/p/16928409.html

相关文章

  • 『题解』UVA 148 Anagram checker
    题目传送门分析貌似除了递归式暴力搜索外,没有其它的有效算法了。这样的话,对代码性能的要求就比较高了,为了快速的判断一个短语是否包含某个单词,必须找出一种特定的数据结......
  • 『题解』UVA 12676 Inverting Huffman
    题目传送门题意静态哈夫曼编码是一种主要用于文本压缩的编码算法。给定一个由\(N\)个不同字符组成的特定长度的文本,算法选择\(N\)个编码,每个不同的字符一个编码。使......
  • 『题解』Codeforces 1743A Password
    Problem现有\(4\)位密码,满足以下条件:给定数位的集合\(S\),密码中没有用到这些数位。密码中恰好包含两个数位,每个数位出现了两次。求符合条件的密码个数。Solution......
  • 『题解』Codeforces 1742C Stripes
    Problem在\(8\times8\)的网格上,轮流染上红色和蓝色。红色只能染一整行。蓝色只能染一整列。问最后用的是哪种颜色。Solution题目说明了至少会染一个条纹,所以我......
  • 『题解』Codeforces 1702A Round Down the Price
    题意这道题其实就是让你求出当前数字与\(10\)的整数幂次的差值(注意不能向上取,只能向下取)。而且题目也标注了\(1\lek\le9\),所以我们可以让\(i\)从\(0\sim9\)......
  • IOS13及以上Fiddler不能抓包问题解决
    iOS 上一般情况下信任HTTPS证书即可抓HTTPS的包(除非APP开启了防止抓包),但最近发现iOS 13以上出现即使安装并信任了证书,当用safari浏览百度时仍出现是否信任该网站......
  • dp完全背包问题解组合问题——零钱兑换
    本题为完全背包问题,遍历容量需要顺序遍历classSolution{public:intchange(intamount,vector<int>&coins){//完全背包顺序遍历//背包容量为a......
  • 题解 P7623 [AHOI2021初中组] 收衣服
    我还在小学的时候以现在初中名义我大五十牛逼参加了这次,然后身败名裂死磕这道题不会,现在觉得自己好傻啊233333显然这是要统计每个区间的贡献,所以我们可以打出来这个暴力,......
  • [蓝桥杯 2022 省 A] 填空问题 题解
    题目传送门这是一道提交答案题,也可以说是一道数学题。第一题我们先来看第一题。由于二维码在纸的中间部分,所以一开始要先裁剪\(4\)刀,这点题目也说了。其次,题目中展......
  • [传智杯 #4 初赛] 竞争得分 题解
    题目传送门这道题主要考察的是"打擂台"算法,也就是求最大或求最小值。就像这样:if(x>maxn)maxn=x;也可以写成这样:maxn=max(maxn,x);最小值同理。然而光......