Uva10795 A Different Task
A Different Task
https://vjudge.net/problem/UVA-10795
题目大意:给定一个汉诺塔初末状态,求从初状态到末状态最少需要多少步。
考虑最大的一个初末不同盘子,设这个盘子为k,初始在start[k],终止在final[k]
比k大的盘子一定在正确位置且在最下面,可以忽略,不妨把他们去掉
k移动到final[k],final[k]上只能有一个盘子k,start[k]上没有盘子,那么1...k-1在6 - start[k] - final[k]上
设f(P,i,j)表示初始状态为P时,把1..i盘子移动到j上的最小步数。若P[i] = j,即i在j盘子上,那么f(P,i,j) = f(P,i-1,j)
若P[i]!=j,若把1...i移动到j,需要6 - P[i] - j做中转把1...i-1移动到(f(P,i-1,6-P[i]-j)),把k移动到j上(1),再把1..k-1以6 - P[i] - j为中转移动到j上
分别从初状态和末状态移动到标准状态即可
答案为f(start, k - 1, 6 - start[k] - final[k]), f(final, k - 1, 6 - start[k] - final[k])
被各种细节卡,比如longlong
![](/assets/blank.gif)
![](/assets/blank.gif)
1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 #include <cstdlib> 5 #include <algorithm> 6 #include <queue> 7 #include <cmath> 8 #include <vector> 9 #define min(a, b) ((a) < (b) ? (a) : (b)) 10 #define max(a, b) ((a) > (b) ? (a) : (b)) 11 #define abs(a) ((a) < 0 ? (-1 * (a)) : (a)) 12 inline void swap(long long &a, long long &b) 13 { 14 long long tmp = a;a = b;b = tmp; 15 } 16 inline void read(long long &x) 17 { 18 x = 0;char ch = getchar(), c = ch; 19 while(ch < '0' || ch > '9') c = ch, ch = getchar(); 20 while(ch <= '9' && ch >= '0') x = x * 10 + ch - '0', ch = getchar(); 21 if(c == '-') x = -x; 22 } 23 24 const long long INF = 0x3f3f3f3f; 25 const long long MAXN = 60 + 5; 26 27 long long start[MAXN], final[MAXN]; 28 29 long long n; 30 31 long long dfs1(long long i, long long j) 32 { 33 if(i <= 0) return 0; 34 if(start[i] == j) return dfs1(i - 1, j); 35 return dfs1(i - 1, 6 - start[i] - j) + ((long long)1 << (i - 1)); 36 } 37 38 long long dfs2(long long i, long long j) 39 { 40 if(i <= 0) return 0; 41 if(final[i] == j) return dfs2(i - 1, j); 42 return dfs2(i - 1, 6 - final[i] - j) + ((long long)1 << (i - 1)); 43 } 44 45 long long t; 46 47 int main() 48 { 49 while(scanf("%d", &n) != EOF && n) 50 { 51 ++ t; 52 memset(start, 0, sizeof(start)); 53 memset(final, 0, sizeof(final)); 54 for(register long long i = 1;i <= n;++ i) read(start[i]); 55 for(register long long i = 1;i <= n;++ i) read(final[i]); 56 long long k = n; 57 while(start[k] == final[k] && k) --k; 58 if(k <= 0) printf("Case %lld: 0\n", t); 59 else printf("Case %lld: %lld\n", t, dfs1(k - 1, 6 - start[k] - final[k]) + dfs2(k - 1, 6 - start[k] - final[k]) + 1); 60 } 61 return 0; 62 }
Uva10795
转载于:https://www.cnblogs.com/huibixiaoxing/p/8286516.html
Uva10795 A Different Task相关推荐
- UVa10795 - A Different Task
思路:因为从0到n-1,disk的尺寸是逐渐变大,而题意是要求尺寸大的不能放在尺寸大的上面.首先选取移动前后不相等的最大的第k个disk,由于只有0,1,2三个柱子,根据第k个disk在移动前,移动后 ...
- UVa10795 - A Different Task(递归)
题目链接 简介:新汉诺塔问题(给出了初始状态和目标状态) 分析: 我们考虑最大的盘子,如果这个盘子初始状态和中止状态在一个柱子上,说明我们根本不用移动ta 那么我们找到编号最大的需要移动是盘子k(初始 ...
- 《算法竞赛入门经典——训练指南》第一章相关内容
#<算法竞赛入门经典--训练指南>第一章相关内容 希望各位大牛能指导! 红色为已经做了的...黄色背景是还有不懂地方,希望在年前能刷完第一章啊.... 更新版.google上貌似又加了ex ...
- VS Code 配置调试参数、launch.json 配置文件属性、task.json 变量替换、自动保存并格式化、空格和制表符、函数调用关系、文件搜索和全局搜索、
1. 生成配置参数 对于大多数的调试都需要在当前项目目录下创建一个 lanch.json 文件,位置是在当前项目目录下生成一个 .vscode 的隐藏文件夹,在里面放置一些配置内容,比如:settin ...
- 完美解决Error:Execution failed for task ':APP:transformClassesWithDexForDebug'...问题
今天下载一个demo运行出现问题,错误如下图 我的问题是JDK 1.8 版本问题问题,我吧1.8改成1.7运行成功 这个实在app下面的build.gradle 相信大伙在Android开发过程中都避 ...
- 安卓中运行报错Error:Execution failed for task ':app:transformClassesWithDexForDebug'解决
在androidstuio中运行我的未完项目,报错: Error:Execution failed for task ':app:transformClassesWithDexForDebug'. & ...
- Execution failed for task ':app:mergeDebugResources'.
这个问题就是资源文件重名了, 它下面有提示的路径,根据路径找到位置, 最后把自己不小心帖进去的删除掉即可 大致如下 Execution failed for task ':app:mergeDebug ...
- Android关于Task的一些实践之SingleTask, SingleInstance和TaskAffinity
上一篇文章粗略地介绍了一下关于Android中Task的基本知识.只是实践才是检验真理的唯一标准,所以.今天就来试验一下Task中的launchMode是否真的实现了文档所说的那样. 首先.定义三个A ...
- Spark源码分析之七:Task运行(一)
在Task调度相关的两篇文章<Spark源码分析之五:Task调度(一)>与<Spark源码分析之六:Task调度(二)>中,我们大致了解了Task调度相关的主要逻辑,并且在T ...
最新文章
- 1057 Stack (30 分)【难度: 中 / 知识点: 树状数组 STL】
- 机器人演唱邓丽君是真的吗_20年后,高科技让她与邓丽君终相逢
- 7个套路让妹子心甘情愿陪你看魔兽世界大电影
- 牛客网NC112--进制转换
- Netweaver 服务器和客户端TLS版本号不匹配的解决方案
- 【elasticsearch】文档 CRUD 增删改查 以及 相关 参数
- 一道简单的但是经典的动态规划题目
- 【图像检索】基于matlab GUI综合颜色和形状特征图像检索【含Matlab源码 1370期】
- 新代系统PLC编程软件 新代PLC编程软件中文版梯形图
- python调用百度通用翻译API进行翻译
- 北斗卫星广播星历计算卫星位置
- java项目 ppt,Java项目报告ppt
- 【转载】C++ Interesting卡常数
- 裁判文书数据docid解密,提供api接口,直接使用
- 低代码开发平台+KM知识文档管理系统搭配的好处
- “印象笔记”使用笔记
- adobe illustrator如何裁剪图像
- java邮箱地址正则表达式_Java 正则表达式匹配邮箱地址
- Symantec Backup Exec Remote Agent for Linux/Unix Servers Installation Guide
- CSDN 博客已式微?
热门文章
- C++学习笔记-----不要在构造函数和析构函数中调用虚函数
- mybatis里的日志动态代理
- Linux命令(11)—— 给文件增加和减少权限chomod命令
- 2440 nand flash和nor flash上启动
- 滑动窗口 - 替换后的最长重复字符
- c++ 如何给 “运行中“ 的线程传递数据;
- 16.1数组为什么特殊
- 综合布线机房服务器维护,信息机房的综合布线系统维护
- 学习记录2-Python中的注册器模块
- html中颜色的编号,html中各种颜色的编号.doc