【GDKOI2004】汉诺塔
题目描述
古老的汉诺塔问题是这样的:用最少的步数将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】汉诺塔的更多相关文章
- JZOJ 2136. 【GDKOI2004】汉诺塔
2136. [GDKOI2004]汉诺塔 (Standard IO) Time Limits: 3000 ms Memory Limits: 128000 KB Detailed Limits ...
- 算法笔记_013:汉诺塔问题(Java递归法和非递归法)
目录 1 问题描述 2 解决方案 2.1 递归法 2.2 非递归法 1 问题描述 Simulate the movement of the Towers of Hanoi Puzzle; Bonus ...
- C#递归解决汉诺塔问题(Hanoi)
using System;using System.Collections.Generic;using System.Linq;using System.Text; namespace MyExamp ...
- 数据结构0103汉诺塔&八皇后
主要是从汉诺塔及八皇后问题体会递归算法. 汉诺塔: #include <stdio.h> void move(int n, char x,char y, char z){ if(1==n) ...
- Conquer and Divide经典例子之汉诺塔问题
递归是许多经典算法的backbone, 是一种常用的高效的编程策略.简单的几行代码就能把一团遭的问题迎刃而解.这篇博客主要通过解决汉诺塔问题来理解递归的精髓. 汉诺塔问题简介: 在印度,有这么一个古老 ...
- 几年前做家教写的C教程(之四专讲了指针与汉诺塔问题)
C语言学习宝典(4) 指针:可以有效的表示复杂的数据结构,能动态的分配动态空间,方便的使用字符串,有效的使用数组,能直接处理内存单元 不掌握指针就没有掌握C语言的精华 地址:系统为每一个变量分配一个内 ...
- python实现汉诺塔
经典递归算法汉诺塔分析: 当A柱子只有1个盘子,直接A --> C 当A柱子上有3个盘子,A上第一个盘子 --> B, A上最后一个盘子 --> C, B上所有盘子(1个) --&g ...
- fzu1036四塔问题(汉诺塔问题拓展)
#include<iostream> #include<cstdio> #include<cmath> using namespace std; ]; int ru ...
- 1019: [SHOI2008]汉诺塔
1019: [SHOI2008]汉诺塔 Time Limit: 1 Sec Memory Limit: 162 MBSubmit: 1495 Solved: 916[Submit][Status] ...
随机推荐
- C#LeetCode刷题之#415-字符串相加(Add Strings)
问题 该文章的最新版本已迁移至个人博客[比特飞],单击链接 https://www.byteflying.com/archives/3873 访问. 给定两个字符串形式的非负整数 num1 和num2 ...
- Python中ansible的使用
#!/usr/bin/env python # -*- coding: utf8 -*- # @Author: huangmanyao from ansible import constants fr ...
- 报错:无效的列类型: 1111;must be specified for all nullable parameters.
org.springframework.jdbc.UncategorizedSQLException: Error setting null parameter. Most JDBC drivers ...
- 实现0.5px边框线
实现0.5px边框方法 方案一:利用渐变(原理:高度1px,背景渐变,一半有颜色,一半透明) CSS部分 .container { width: 500px; margin: 0px auto; } ...
- Kubernetes 编写自定义 controller
原文链接:Kubernetes编写自定义controller 来自kubernetes官方github的一张图: 如图所示,图中的组件分为client-go和custom controller两部分: ...
- Spring Security自定义认证页面(动态网页解决方案+静态网页解决方案)--练气中期圆满
写在前面 上一回我们简单分析了spring security拦截器链的加载流程,我们还有一些简单的问题没有解决.如何自定义登录页面?如何通过数据库获取用户权限信息? 今天主要解决如何配置自定义认证页面 ...
- [Warning] TIMESTAMP with implicit DEFAULT value is deprecated. Please use --explicit_defaults_for_timestamp server option (see documentation for more details).
Linux下安装MySQL执行scripts/mysql_install_db --user=mysql脚本时,报错如下: Filling help tables...2019-12-24 16:46 ...
- 学生成绩管理系统(SSM+MySQL+JSP)
开发工具:Eclipse前端技术:基础:html+css+JavaScript框架:JQuery+H-ui后端技术:Spring+SpringMVC+mybatis模板引擎:JSP数据库:mysql ...
- 如何利用微博客进行seo赚钱营销
http://www.wocaoseo.com/thread-130-1-1.html 我们知道做SEO就是用人的思维来模仿搜索引擎的习惯,尽量适应seo的规则,并按照搜索引擎的规则和习惯 ...
- 焦大:seo思维光年(上)检索的价值观
http://www.wocaoseo.com/thread-55-1-1.html 检索的价值观是什么?最近很多人咨询我这个问题,因为在百度上根本找不到相关的资料,其实这个东西也是我自己总结的,比如 ...