汉诺塔VIII,在经典汉若塔问题上,问n个盘子的情况下,移动m次以后,是什么状态。(与第七代互为逆命题)

我的思路:本质还是dfs,但是用m的值来指引方向,每搜一层确定第i个盘子在哪个塔,o(n)的算法,看图说明:

#include<iostream>
#include<vector>
using namespace std;
char get[65]; //记录I号盘子在哪个塔
long long f[65]; //2^i次的值
void got() //预处理的f[i]; 注意点:用1<<i会爆int。
{
f[1]=2;
for(int i=2;i<65;i++)
f[i]=f[i-1]*2;
}
void dfs(char fl,char fr,char now,int lev,long long x) //同汉若塔第七代理,LVE是层数,x是目前的值
{
get[lev]=now;
if(lev==1)return; //出口
char temp;
if(fl=='A'&&fr=='B'||fl=='B'&&fr=='A')temp='C';
else if(fl=='A'&&fr=='C'||fl=='C'&&fr=='A')temp='B';
else temp='A';
lev--;
long long tx=(f[lev]-1)/2;
if(x<=tx) //小于它的
{
if(now==fl) //左边的下来
dfs(fl,temp,fl,lev,x);
else
dfs(temp,fr,temp,lev,x);
}
else
{
if(now==fl)
dfs(fl,temp,temp,lev,x-tx-1); //减一,那一步是最下面的塔的移动
else
dfs(temp,fr,fr,lev,x-tx-1);
}
}
int main()
{
got();
int T;
cin>>T;
while(T--)
{
long long n,m;
cin>>n>>m;
if(m<=(f[n]-1)/2)
dfs('A','C','A',n,m);
else
dfs('A','C','C',n,m-(f[n]-1)/2);
vector<int>a,b,c;
for(int i=n;i>=1;i--)
{
if(get[i]=='A')a.push_back(i);
else if(get[i]=='B')b.push_back(i);
else c.push_back(i);
}
cout<<a.size();
for(int i=0;i<a.size();i++)
cout<<" "<<a[i];
cout<<endl;
cout<<b.size();
for(int i=0;i<b.size();i++)
cout<<" "<<b[i];
cout<<endl;
cout<<c.size();
for(int i=0;i<c.size();i++)
cout<<" "<<c[i];
cout<<endl;
}
return 0;
}

汉若塔IX hdu2175,经典汉若塔问题上问第M次移动的是几号盘。

思路:同理,第n个盘之前,必先移动前n-1个,再移动第n号,再移动前n-1个,依次。所以二分法查找,在“中间”那个移动的酒在那一个盘了。

#include<iostream>
using namespace std;
long long f[65]; //2^i次的值
void got() //预处理的f[i]; 注意点:用1<<i会爆int。
{
f[0]=1;f[1]=2;
for(int i=2;i<65;i++)
f[i]=f[i-1]*2;
}
int main()
{
got();
long long n,m;
while(cin>>n>>m&&(n||m))
{
while(m!=f[n-1])
{
if(m<=f[n-1]-1)
;
else
m=m-f[n-1];
n--;
}
cout<<n<<endl;
}
return 0;
}

汉若塔X  hdu2511  求第m次移动是把几号盘从哪个塔到哪个塔移动。第九代的扩展。

思路:做到这里,每步的移动已经一清二楚了,还是那颗树,“左中右”遍历序列便是所有状态。由于一共就6种可能移动法。每次移动后知道下一步的移动。

依旧采用二分寻根法,详见代码:

#include<iostream>
#include<string>
using namespace std;
long long f[65]; //2^i次的值
void got() //预处理的f[i]; 注意点:用1<<i会爆int。
{
f[0]=1;f[1]=2;
for(int i=2;i<65;i++)
f[i]=f[i-1]*2;
}
string getnext(string s,int id) //状态转移
{
if(s=="AC")
{
if(id==0)return "AB";
else return "BC";
}
else if(s=="AB")
{
if(id==0)return "AC";
else return "CB";
}
else if(s=="CB")
{
if(id==0)return "CA";
else return "AB";
}
else if(s=="CA")
{
if(id==0)return "CB";
else return "BA";
}
else if(s=="BA")
{
if(id==0)return "BC";
else return "CA";
}
else if(s=="BC")
{
if(id==0)return "BA";
else return "AC";
}
}
int main()
{
got();
int T;
cin>>T;
long long n,m;
while(T--)
{
cin>>n>>m;
string s="AC";
while(m!=f[n-1])
{
if(m<=f[n-1]-1)
{
s=getnext(s,0);
}
else
{
s=getnext(s,1);
m=m-f[n-1];
}
n--;
}
if(s=="AB")
cout<<n<<" 1 2"<<endl;
if(s=="BA")
cout<<n<<" 2 1"<<endl;
if(s=="AC")
cout<<n<<" 1 3"<<endl;
if(s=="CA")
cout<<n<<" 3 1"<<endl;
if(s=="BC")
cout<<n<<" 2 3"<<endl;
if(s=="CB")
cout<<n<<" 3 2"<<endl;
}
return 0;
}

汉若塔系列续:汉诺塔VIII、汉诺塔IX、汉诺塔X。的更多相关文章

  1. HDU汉诺塔系列

    这几天刷了杭电的汉诺塔一套,来写写题解. HDU1207 汉诺塔II HDU1995 汉诺塔V HDU1996 汉诺塔VI HDU1997 汉诺塔VII HDU2064 汉诺塔III HDU2077  ...

  2. HBase之CF持久化系列(续3——完结篇)

    相信大家在看了该系列的前两篇文章就已经对其中的持久化有比较深入的了解.相对而言,本节内容只是对前两节的一个巩固.与持久化相对应的是打开文件并将其内容读入到内存变量中.而在本节,我就来介绍这一点. 本节 ...

  3. HBase之CF持久化系列(续2)

    正如上篇博文所说,在本节我将为大家带来StoreFlusher.finalizeWriter..如果大家没有看过我的上篇博文<HBase之CF持久化系列(续1)>,那我希望大家还是回去看一 ...

  4. 汉诺塔系列问题: 汉诺塔II、汉诺塔III、汉诺塔IV、汉诺塔V、汉诺塔VI

    汉诺塔 汉诺塔II hdu1207: 先说汉若塔I(经典汉若塔问题),有三塔.A塔从小到大从上至下放有N个盘子.如今要搬到目标C上. 规则小的必需放在大的上面,每次搬一个.求最小步数. 这个问题简单, ...

  5. HDU 汉诺塔系列

    做了这一系列题,表示对汉诺塔与这一系列递推理解加深了 经典汉诺塔:1,2,...,n表示n个盘子,数字大盘子就大,n个盘子放在第1根柱子上,按照从上到下 从小到大的顺序排放,过程中每次大盘都不能放在小 ...

  6. 文本编辑器激活系列(二):UltraEdit安装、激活、汉化教程

    如您激活出现问题,请点击这里加入:软件激活问题解决群 前言 推荐几款文本编辑器: Sublime:内嵌python解释器.大量插件 EditPlus:语法着色.内嵌浏览器 Notepad++:所见即所 ...

  7. 文本编辑器激活系列(一):Sublime 安装、激活、汉化教程

    如您激活出现问题,请点击这里加入:软件激活问题解决群 前言 推荐几款文本编辑器: Sublime:内嵌python解释器.大量插件 EditPlus:语法着色.内嵌浏览器 Notepad++:所见即所 ...

  8. HBase之CF持久化系列(续1)

    这一节本来打算讲解HRegion的初始化过程中一些比较复杂的流程.不过,考虑前面的博文做的铺垫并不够,因此,在这一节,我还是特意来介绍HBase的CF持久化.关于这个话题的整体流程性分析在博文< ...

  9. 算法笔记_013:汉诺塔问题(Java递归法和非递归法)

    目录 1 问题描述 2 解决方案  2.1 递归法 2.2 非递归法 1 问题描述 Simulate the movement of the Towers of Hanoi Puzzle; Bonus ...

随机推荐

  1. python_110_反射

    class Dog(object): def __init__(self,name): self.name=name def eat(self): print('%s is eating '%self ...

  2. Bzoj 1085: [SCOI2005]骑士精神 (dfs)

    Bzoj 1085: [SCOI2005]骑士精神 题目链接:https://www.lydsy.com/JudgeOnline/problem.php?id=1085 dfs + 剪枝. 剪枝方法: ...

  3. 【转】pycharm使用中的一些快捷键

    正在使用pycharm,发现多行注释以及大块代码格式化的时候却急于没有快捷方式,于是百度了一下,恰好看到这位博主的总结,大部分我使用的不多,不过还是全部粘了过来,以备将来不时之需. [转载]博主地址链 ...

  4. 一次线上mysql死锁分析

    一.现象 发运车次调用发车接口时发生异常,后台抛出数据库死锁日志. 二.原因分析 通过日志可以看出事务T1等待 heap no 8的行锁 (X locks 排他锁) 事务T2持有heap no 8的行 ...

  5. Python可变与不可变类型及垃圾回收机制

    1. 可变与不可变类型 1.1  可变类型 在id不变的情况下,value可以改变,则称之为可变类型.列表.字典与集合是可变的. l1 = [,,,,] print(id(l1)) l1[] = #改 ...

  6. 【Python学习之一】list与tuple

    list -> [] list是python内置的有序集合数据类型,可随时添加和删除元素.例如:创建一个动物的列表: animal = ['cat', 'dog', 'pig' len()函数可 ...

  7. JQuery中xxx is not a function或者can not find $

    在项目中,遇到以上两个错误,反复折腾了好久,js代码写得没有问题,jquery的文件也引入了,就是反复的报告错误,xxx is not a function.如图: 就是这样的错误,shake is ...

  8. SQLServer数据库查看死锁、堵塞情况

    在压力测试过程中,不间断的按F5键执行上面的SQL语句,如果出现死锁或者堵塞现象,就会在执行结果中罗列出来.如果每次连续执行SQL,都有死锁或者堵塞出现,说明死锁或者堵塞的比较严重. --每秒死锁数量 ...

  9. joyoi1864 守卫者的挑战

    #include <algorithm> #include <iostream> #include <cstdio> using namespace std; in ...

  10. iphone丢了以后发现关机了怎么办?

    有好几个办法都可以尝试一下: 1. "ICCID法",但目前这个办法只能寻找苹果iPhone手机,而对于安卓手机,则不能采取相同的方法进行寻找.之所以能采取该方法寻找苹果 iPho ...