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

 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相关推荐

  1. UVa10795 - A Different Task

    思路:因为从0到n-1,disk的尺寸是逐渐变大,而题意是要求尺寸大的不能放在尺寸大的上面.首先选取移动前后不相等的最大的第k个disk,由于只有0,1,2三个柱子,根据第k个disk在移动前,移动后 ...

  2. UVa10795 - A Different Task(递归)

    题目链接 简介:新汉诺塔问题(给出了初始状态和目标状态) 分析: 我们考虑最大的盘子,如果这个盘子初始状态和中止状态在一个柱子上,说明我们根本不用移动ta 那么我们找到编号最大的需要移动是盘子k(初始 ...

  3. 《算法竞赛入门经典——训练指南》第一章相关内容

    #<算法竞赛入门经典--训练指南>第一章相关内容 希望各位大牛能指导! 红色为已经做了的...黄色背景是还有不懂地方,希望在年前能刷完第一章啊.... 更新版.google上貌似又加了ex ...

  4. VS Code 配置调试参数、launch.json 配置文件属性、task.json 变量替换、自动保存并格式化、空格和制表符、函数调用关系、文件搜索和全局搜索、

    1. 生成配置参数 对于大多数的调试都需要在当前项目目录下创建一个 lanch.json 文件,位置是在当前项目目录下生成一个 .vscode 的隐藏文件夹,在里面放置一些配置内容,比如:settin ...

  5. 完美解决Error:Execution failed for task ':APP:transformClassesWithDexForDebug'...问题

    今天下载一个demo运行出现问题,错误如下图 我的问题是JDK 1.8 版本问题问题,我吧1.8改成1.7运行成功 这个实在app下面的build.gradle 相信大伙在Android开发过程中都避 ...

  6. 安卓中运行报错Error:Execution failed for task ':app:transformClassesWithDexForDebug'解决

    在androidstuio中运行我的未完项目,报错: Error:Execution failed for task ':app:transformClassesWithDexForDebug'. & ...

  7. Execution failed for task ':app:mergeDebugResources'.

    这个问题就是资源文件重名了, 它下面有提示的路径,根据路径找到位置, 最后把自己不小心帖进去的删除掉即可 大致如下 Execution failed for task ':app:mergeDebug ...

  8. Android关于Task的一些实践之SingleTask, SingleInstance和TaskAffinity

    上一篇文章粗略地介绍了一下关于Android中Task的基本知识.只是实践才是检验真理的唯一标准,所以.今天就来试验一下Task中的launchMode是否真的实现了文档所说的那样. 首先.定义三个A ...

  9. Spark源码分析之七:Task运行(一)

    在Task调度相关的两篇文章<Spark源码分析之五:Task调度(一)>与<Spark源码分析之六:Task调度(二)>中,我们大致了解了Task调度相关的主要逻辑,并且在T ...

最新文章

  1. 1057 Stack (30 分)【难度: 中 / 知识点: 树状数组 STL】
  2. 机器人演唱邓丽君是真的吗_20年后,高科技让她与邓丽君终相逢
  3. 7个套路让妹子心甘情愿陪你看魔兽世界大电影
  4. 牛客网NC112--进制转换
  5. Netweaver 服务器和客户端TLS版本号不匹配的解决方案
  6. 【elasticsearch】文档 CRUD 增删改查 以及 相关 参数
  7. 一道简单的但是经典的动态规划题目
  8. 【图像检索】基于matlab GUI综合颜色和形状特征图像检索【含Matlab源码 1370期】
  9. 新代系统PLC编程软件 新代PLC编程软件中文版梯形图
  10. python调用百度通用翻译API进行翻译
  11. 北斗卫星广播星历计算卫星位置
  12. java项目 ppt,Java项目报告ppt
  13. 【转载】C++ Interesting卡常数
  14. 裁判文书数据docid解密,提供api接口,直接使用
  15. 低代码开发平台+KM知识文档管理系统搭配的好处
  16. “印象笔记”使用笔记
  17. adobe illustrator如何裁剪图像
  18. java邮箱地址正则表达式_Java 正则表达式匹配邮箱地址
  19. Symantec Backup Exec Remote Agent for Linux/Unix Servers Installation Guide
  20. CSDN 博客已式微?

热门文章

  1. C++学习笔记-----不要在构造函数和析构函数中调用虚函数
  2. mybatis里的日志动态代理
  3. Linux命令(11)—— 给文件增加和减少权限chomod命令
  4. 2440 nand flash和nor flash上启动
  5. 滑动窗口 - 替换后的最长重复字符
  6. c++ 如何给 “运行中“ 的线程传递数据;
  7. 16.1数组为什么特殊
  8. 综合布线机房服务器维护,信息机房的综合布线系统维护
  9. 学习记录2-Python中的注册器模块
  10. html中颜色的编号,html中各种颜色的编号.doc