首页 > 其他分享 >题解 P4285 [SHOI2008] 汉诺塔

题解 P4285 [SHOI2008] 汉诺塔

时间:2023-10-27 21:55:06浏览次数:42  
标签:柱子 int 题解 移回 汉诺塔 P4285 盘子

具体思路

设 \(f_{i,x}\) 表示 \(i\) 个盘子从 \(x\) 柱子出发的步数。

设 \(g_{i,x}\) 表示 \(i\) 个盘子从 \(x\) 柱子出发到哪个柱子。

记 \(y=g_{i-1,x}\),\(z=6-x-y\)。

其中,\(y\) 代表将前 \(i-1\) 个盘子从 \(x\) 柱子移到的柱子,\(z\) 代表剩下的那个柱子。

分类讨论。

  • 若 \(g_{i-1,y}=z\),表示 \(i-1\) 个盘子先从 \(x\) 移到 \(y\),第 \(i\) 个盘子从 \(x\) 移到 \(z\),\(i-1\) 个盘子再从 \(y\) 移回 \(z\)。

\(f_{i,x}=f_{i-1,x}+1+f_{i-1,y},g_{i,x}=z\)。

  • 若 \(g_{i-1,y}=x\),表示 \(i-1\) 个盘子先从 \(x\) 移到 \(y\),第 \(i\) 个盘子从 \(x\) 移到 \(z\),\(i-1\) 个盘子再从 \(y\) 移回 \(x\),第 \(i\) 个盘子从 \(z\) 移到 \(y\),\(i-1\) 个盘子再从 \(x\) 移回 \(y\)。

\(f_{i,x}=f_{i-1,x}+1+f_{i-1,y}+1+f_{i-1,x},g_{i,x}=y\)。

Code

#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
const int N=31,M=4;
int g[N][M],vis[M];LL f[N][M];
int main(){
	int n;scanf("%d",&n);
	for(int i=1;i<=6;i++){
		char op[10];scanf("%s",op+1);
		int x=op[1]-'A'+1,y=op[2]-'A'+1;
		if(vis[x])continue;
		vis[x]=1;
		f[1][x]=1,g[1][x]=y;
	}
	for(int i=2;i<=n;i++){
		for(int x=1;x<=3;x++){
			int y=g[i-1][x],z=6-x-y;
			if(g[i-1][y]==z){
				f[i][x]=f[i-1][x]+1+f[i-1][y];
				g[i][x]=z;
			}
			if(g[i-1][y]==x){
				f[i][x]=f[i-1][x]+1+f[i-1][y]+1+f[i-1][x];
				g[i][x]=y;
			}
		}
	}
	printf("%lld\n",f[n][1]);
	return 0;
}

标签:柱子,int,题解,移回,汉诺塔,P4285,盘子
From: https://www.cnblogs.com/reclusive2007/p/17793211.html

相关文章

  • P2230 Tinux系统 题解
    传送门提供一种基于贪心的解法。首先是将\(p\)从小到大排序考虑到该系统是一棵树,所以对于系统中的每个点,我们记:\(tr_{son}\)表示该点(目录)的儿子的位置\(tr_{fa}\)表示该点(目录)的父亲的位置\(tr_{siz}\)表示该点(目录)包含的点的个数\(tr_{cnt}\)表示该点(目录)有......
  • YACS 2023年10月月赛 甲组 题解
    目前只有T2,其他题目我在看。题目链接1题目链接2题目链接3T2很简单的一道题,将图分为若干个连通块,然后分别求最小生成树。从货车运输中得到的结论,最小生成树等价于最小边权上限生成树,也就是它也能够保证选出边中最大的边权最小。而题目中明确说了这个最小生成树的权值是其中......
  • [NOI2010] 超级钢琴 题解
    [NOI2010]超级钢琴题解说点闲话原本不想写这个题解的但是看到我的代码居然长度为2048B->刚好2KiB,然后还跟题号相同QAQ题目翻译给你一段序列,求出其中从第\(1\)大到第\(k\)大的子区间的和。思路解析首先可以想到一个简单的暴力,对于每一个区间开头\(i\),和区间结尾\(j\),都求......
  • 2023 CSP-J2 T1,2,3题解
    今年的\(CSP−J\)对本蒟蒻来说有点难度。。。A[CSP-J2023]小苹果题目描述小Y的桌子上放着\(n\)个苹果从左到右排成一列,编号为从\(1\)到\(n\)。小苞是小Y的好朋友,每天她都会从中拿走一些苹果。每天在拿的时候,小苞都是从左侧第\(1\)个苹果开始、每隔\(2\)个......
  • [TJOI2013] 松鼠聚会 题解
    [TJOI2013]松鼠聚会题解切比雪夫距离切比雪夫距离指的是在平面上的两个点\((x_1,y_1)\),\((x_2,y_2)\)之间横纵坐标之差绝对值中的大者。用公式表示则是\(f(a,b)=max(|x_a-x_b|,|y_a-y_b|)\)。切比雪夫距离与曼哈顿距离之间可以相互转换切比雪夫—>曼哈顿:\((x_1,y_1)\),\((x......
  • [NOIP 2013提高组]货车运输 题解
    [NOIP2013提高组]货车运输题解前置知识Kruskal重构树(内含讲解)+任意一种LCA题目翻译\(n\)座城市,\(m\)条道路,\(q\)次询问,每次求两个点\(x,y\)之间所有路径的最小值的最大值。题目分析其实学了Kruskal重构树差不多看到这个题目就知道怎么写了。其实就是Kruskal重构树的板子,......
  • 问题解决
    pip源问题解决使用pip安装pytorch出现WARNING:Retrying(Retry(total=4,connect=None,read=None,redirect=None,status=None))报错使用换源解决问题pip3configlistpip3configsetglobal.index-urlhttps://mirrors.aliyun.com/pypi/simple/pip3configlist国内......
  • 第四章苏格拉底问答、实践过程截图、遇到问题解决问题截图,代码链接
    代码#include<stdio.h>#include<stdlib.h>#include<pthread.h>#defineN4intA[N][N],sum[N];void*func(voidarg){intj,row;pthread_ttid=pthread_self();row=(int)arg;printf("Thread%d[%lu]computessumofrow%d\n"......
  • Python打不开问题解决方案大全
    在使用Python进行编程开发的过程中,我们不可避免会遇到Python打不开的问题。这些问题可能是由于环境配置、包管理和依赖文件等问题所导致的,但不管是何种原因,我们都需要解决它们才能顺利地进行工作。本文将从多个方面为大家详细介绍Python打不开问题的解决方法。一、Python环境配......
  • Acwing393. 雇佣收银员 题解 差分约束
    题目链接:https://www.acwing.com/problem/content/description/395/解题思路:差分约束。为了方便起见,定义第\(i\)个时间段为\(i-1:00\)到\(i:00\)首先,为了方便开一个额外的点,令\(R_i\)对应为题目中的\(R(i+1)\),即\(R_i\)表示\(i-1:00\)到\(i:00\)这个时间段的最小需求......