汉诺塔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. softmax_loss.cu 和 softmax_loss.cpp源码

    #include <algorithm> #include <cfloat> #include <vector> #include "caffe/laye ...

  2. CS 分解

    将学习到什么 CS 分解是分划的酉矩阵在分划的酉等价之下的标准型. 它的证明涉及奇异值分解.QR 分解以及一个简单习题.   一个直观的习题 设 \(\Gamma, L \in M_p\). 假设 \ ...

  3. QR 分解

    将学习到什么 介绍了平面旋转矩阵,Householder 矩阵和 QR 分解以入相关性质.   预备知识 平面旋转与 Householder 矩阵是特殊的酉矩阵,它们在建立某些基本的矩阵分解过程中起着 ...

  4. 【Qt】2.2 继续了解信号和槽

    槽和普通成员函数一样,可以是虚函数.被重载,可以是公有.私有.保护的.它可以被其它C++成员函数调用. 槽连接了信号,当发射这个信号时,槽会被自动调用. 连接函数: bool QObject::con ...

  5. 多线程threadvar 变量设定

    Delphi管理多线程之线程局部存储:threadvar 尽管多线程能够解决许多问题,但是同时它又给我们带来了很多的问题.其中主要的问题就是:对全局变量或句柄这样的全局资源如何访问?另外,当必须确保一 ...

  6. jQuery-AJAX简介

    AJAX是浏览器后台与服务器交换数据的技术,无须加载整个页面的情况下,对页面中的局部进行更新. AJAX=异步的JavaScript与XML(Asynchronous JavaScript and X ...

  7. (18)zabbix值映射Value mapping

    1. 介绍 zabbix为了显示更人性化的数据,在使用过程中,我们可以将获取到得数据映射为一个字符串. 比如,我们写脚本监控MySQL是否在运行中, 一般返回0表示数据库挂了,1表示数据库正常,还有各 ...

  8. GIMP中的新建Layer与更改Layer大小

    这边可以直接New Layer,新建一个Layer,还可以New from Visible,第二种是将当前的状态下图像复制出来. 改变Layer的大小,一般的方法两种: Crop to Selecti ...

  9. mysql 导入数据库

    1:创建数据库 dos 进入 xxx\MySQL5.7\bin 目录(很多人喜欢把这个路径配置在环境变量path中,这样在dos敲命令时,就直接是mysql......) mysql -uroot - ...

  10. 条款40:明智而审慎地使用多重继承(use multiple inheritance judiciously)

    NOTE: 1.多重继承比单一继承复杂.它可能导致新的歧义性,以及对virtual继承的需要. 2.virtual 继承会增加大小 速度 初始化(及赋值)复杂度等等成本.如果virtual base ...