题意:给出所有盘子的初态和终态,问最少多少步能从初态走到终态,其余规则和老汉诺塔一样。

思路:

若要把当前最大的盘子m从1移动到3,那么首先必须把剩下的所有盘子1~m-1放到2上,然后把m放到3上。

现在要解决怎样将一个状态s0转移到s(1~k全部放到一个盘子c上面),要放k,那么必须先有一个相似的状态s0,:1~k-1放到一个盘子,然后转移k,然后将1~k-1再放到k上面(原始的汉若塔问题,步数为2^(1<<(k-1)) ),可以看出解决s0和解决s是一个问题,这就得到了状态转移方程了,可以递归了。

由老汉诺塔的公式,将n个在一个柱子上排列好的盘子移动到另一个柱子需要2^n步。

#include<cstdio>
#include<set>
#include<iostream>
#include<vector>
#include<algorithm>
#include<map>
using namespace std;
#define N 65 int st[N];
int en[N]; long long solve(int *p,int x,int epos)
{
if(x==)
return ;
if(p[x]==epos)
return solve(p,x-,epos);
return solve(p,x-,-epos-p[x])+(1LL<<(x-));
} int main()
{
int n,cnt=;
while(scanf("%d",&n)!=EOF&&n)
{
for(int i=; i<=n; i++)
scanf("%d",&st[i]);
for(int i=; i<=n; i++)
scanf("%d",&en[i]);
int k=n;
while(st[k]==en[k])
k--;
long long res=;
if(k>)
{
int other=-st[k]-en[k];
res=solve(st,k-,other)+solve(en,k-,other)+; }
printf("Case %d: %lld\n",++cnt,res);
}
return ;
}

最新文章

  1. Bzoj1426 收集邮票
  2. Redis学习资源
  3. 事件冒泡和事件捕获以及解释target和currenttarget的区别
  4. linux android真机测试
  5. HTML5实战与剖析之触摸事件(touchstart、touchmove和touchend)
  6. php遇见的错误(一)
  7. html实体字符
  8. markdown语法学习源码
  9. 【mysql的编程专题⑤】自定义函数
  10. java实现附件预览(openoffice+swfTools+FlexPaper) (转载)
  11. IOS 点击空白处隐藏键盘的几种方法
  12. 实力为王 八年DBA经验谈
  13. scu - 3254 - Rain and Fgj(最小点权割)
  14. 《团队作业第二周》五小福团队作业——UNO
  15. 如何在Qt中使用自定义数据类型
  16. Python开发——数据类型【列表】
  17. 3.5《想成为黑客,不知道这些命令行可不行》(Learn Enough Command Line to Be Dangerous)—第三章小结
  18. headfirst python 01~02
  19. 基于iscroll的better-scroll在vue中的使用
  20. saltstack returners 结果转存

热门文章

  1. jq仿ps颜色拾取功能-js颜色拾取
  2. nodejs 运行
  3. [Vue-rx] Cache Remote Data Requests with RxJS and Vue.js
  4. 前端project师必需知识点
  5. URAL 1822. Hugo II&amp;#39;s War 树的结构+二分
  6. 解决无线网卡 RTL8723BE ubuntu环境下不稳定情况
  7. 【HDU1530】【ZOJ1492】Maximum Clique
  8. 第三周 Leetcode 4. Median of Two Sorted Arrays (HARD)
  9. Spark 机器学习 ---TF-IDF
  10. codevs1669 运输装备(背包dp)