题目描述

古老的汉诺塔问题是这样的:用最少的步数将N个半径互不相等的圆盘从1号柱利用2号柱全部移动到3号柱,在移动的过程中小盘要始终在大盘的上面。

  现在再加上一个条件:不允许直接把盘从1号柱移动到3号柱,也不允许直接把盘从3号柱移动到1号柱。

  把盘按半径从小到大用1到N编号。每种状态用N个整数表示,第i个整数表示i号盘所在的柱的编号。则N=2时的移动方案为:

  (1,1)=>(2,1)=>(3,1)=>(3,2)=>(2,2)=>(1,2)=>(1,3)=>(2,3)=>(3,3)

  初始状态为第0步,编程求在某步数时的状态。

输入

 输入文件的第一行为整数T(1<=T<=50000),表示输入数据的组数。

  接下来T行,每行有两个整数N,M(1<=n<=19,0<=M<=移动N个圆盘所需的步数)。

输出

输出文件有T行。

  对于每组输入数据,输出N个整数表示移动N个盘在M步时的状态,每两个数之间用一个空格隔开,行首和行末不要有多余的空格。

个人想法

嗯。。。网络有点卡,不太好讲那么复杂的东西。

[怒火中烧]*1000000000000…000000:你到底讲不讲?

讲讲讲,不然我写这干哈

方法1

先设置f[i],表示i个圆盘全部从第1个柱子到第3个柱子需要的步数。

蒟蒻找规律

f[1]=2 f[2]=8 f[3]=26

好,于是乎——

f[i]=f[i-1]*3+2

再设s[i]为当前状态下第i个圆盘所在的位置。

我们再从f[n]到f[1]暴力判断是否成立,成立再改变s[i]值,最后输出就好了

方法2

————大打表之术————

将答案一个个copy下来,使用条件判断语句,AC

预计时间复杂度:O(1)

#include<cstdio>
#include<cstring>
using namespace std;
int t,i,n,m,j,k,q,f[20],s[20],l;
bool bz[20];
int main()
{
scanf("%d",&q);
for (i=1;i<=q;++i)
{
scanf("%d%d",&n,&m);
t=0;
memset(f,0,sizeof(f));
while (f[t]<m)
{
t++;
f[t]=f[t-1]*3+2;
}
memset(bz,0,sizeof(bz));
l=t-1;
if (t==0)
{
for (j=1;j<=n;j++)
{
printf("%d%c",1,' ');
}
printf("\n");
} else
{
if (f[t]==m)
{
for (j=1;j<=t;j++)
{
printf("%d%c",3,' ');
}
for (j=t+1;j<=n;j++)
{
printf("%d%c",1,' ');
}
printf("\n");
}else
{
for (j=1;j<=n;j++)
s[j]=1;
t=0;
for (j=l;j>=1;--j)
{
if (t+f[j]+1<=m)
{
t+=f[j]+1;
for (k=1;k<=j;k++)
{
if (bz[j]==0)
{
s[k]=3;
bz[k]=1;
}else
{
s[k]=1;
bz[k]=0;
}
}
if (bz[j+1]==1) s[j+1]-=1;else s[j+1]+=1;
if (s[j+1]==3) bz[j+1]=1;
if (s[j+1]==1) bz[j+1]=0;
j++;
}
}
while (t<m)
{
t++;
if (bz[1]==0) s[1]++;else s[1]--;
if (s[1]==n) bz[1]=1;
if (s[1]==1) bz[1]=0;
}
for (j=1;j<=n;j++)
{
printf("%d%c",s[j],' ');
}
printf("\n");
} }
}
}

【GDKOI2004】汉诺塔的更多相关文章

  1. JZOJ 2136. 【GDKOI2004】汉诺塔

    2136. [GDKOI2004]汉诺塔 (Standard IO) Time Limits: 3000 ms  Memory Limits: 128000 KB  Detailed Limits   ...

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

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

  3. C#递归解决汉诺塔问题(Hanoi)

    using System;using System.Collections.Generic;using System.Linq;using System.Text; namespace MyExamp ...

  4. 数据结构0103汉诺塔&八皇后

    主要是从汉诺塔及八皇后问题体会递归算法. 汉诺塔: #include <stdio.h> void move(int n, char x,char y, char z){ if(1==n) ...

  5. Conquer and Divide经典例子之汉诺塔问题

    递归是许多经典算法的backbone, 是一种常用的高效的编程策略.简单的几行代码就能把一团遭的问题迎刃而解.这篇博客主要通过解决汉诺塔问题来理解递归的精髓. 汉诺塔问题简介: 在印度,有这么一个古老 ...

  6. 几年前做家教写的C教程(之四专讲了指针与汉诺塔问题)

    C语言学习宝典(4) 指针:可以有效的表示复杂的数据结构,能动态的分配动态空间,方便的使用字符串,有效的使用数组,能直接处理内存单元 不掌握指针就没有掌握C语言的精华 地址:系统为每一个变量分配一个内 ...

  7. python实现汉诺塔

    经典递归算法汉诺塔分析: 当A柱子只有1个盘子,直接A --> C 当A柱子上有3个盘子,A上第一个盘子 --> B, A上最后一个盘子 --> C, B上所有盘子(1个) --&g ...

  8. fzu1036四塔问题(汉诺塔问题拓展)

    #include<iostream> #include<cstdio> #include<cmath> using namespace std; ]; int ru ...

  9. 1019: [SHOI2008]汉诺塔

    1019: [SHOI2008]汉诺塔 Time Limit: 1 Sec  Memory Limit: 162 MBSubmit: 1495  Solved: 916[Submit][Status] ...

随机推荐

  1. 2020-04-20:对Java接口代理模式的实现原理的理解?

    静态代理Java中的静态代理要求代理类(ProxySubject)和委托类(RealSubject)都实现同一个接口(Subject).静态代理中代理类在编译期就已经确定,而动态代理则是JVM运行时动 ...

  2. Take C# 8.0 for a spin

    本文章为机器翻译.https://blogs.msdn.microsoft.com/dotnet/2018/12/05/take-c-8-0-for-a-spin/ 以C # 8兜风 我们昨天宣布Vi ...

  3. JNDI和连接池的配置

    什么是JNDI: Java Naming and Directory Interface,Java命名和目录接口 通过名称将资源与服务进行关联 配置JNDI的步骤:在tomcat下的Context.x ...

  4. 【算法•日更•第二十八期】图论:强连通+Tarjan算法(一)

    ▎前言 一直都想学习这个东西,以为很难,结果发现也不过如此. 只要会些图论的基础就可以了. ▎强连通 ☞『定义』 既然叫强连通,那么一定具有很强的连通性. 强连通:就是指在一个有向图中,两个顶点可以互 ...

  5. jqgrid 获取选中用户的数据插入

    因为查询出的表和被插入的表不是在同一个数据库,所以先从前台jqgrid表格中获取到数据后,再插入表中. 实现: 获取到jqgrid选中 的每行数据之后,发ajax请求把数据以json格式传入后台,后台 ...

  6. 【翻译】Promises/A+规范

    目录 介绍 译文 1. 术语(Terminology) 2. 要求(Requirements) 2.1 Promise状态 2.2 then方法 2.3 Promise解析程序 3. 注释 3.1 p ...

  7. cinder 卷迁移进度的代码分析

    一.cinder-api服务的入口函数 D:\code-program\cinder-ocata_cinder\cinder\api\contrib\admin_actions.py from cin ...

  8. Java 类初始化和实例初始化过程

    1.类初始化过程 2.实例初始化过程 3.方法的重写

  9. 算法-排序(1)k路平衡归并与败者树

    const int MaxValue=; //根据实际情况选择最大值 void kwaymerge(Element *r,int k){ int i,q; r=new Element[k]; //在败 ...

  10. 两台Linux服务器文件同步

    在给公司或者学校做系统部署的时候,为了数据安全往往我们至少需要两台服务器,接下来请看: 我们要实现的是把客户端(192.168.0.1)的复制到目标服务器(192.168.0.2) 一.目标服务器 1 ...