洛谷P1242 新汉诺塔
传送门啦
首先要将第n个盘子从x到y,那么就要把比n小的盘子全部移到6-x-y,然后将n移到y
仔细想想:6代表的是3根初始柱,3根目标柱。
6-(x+y) 便是我们的中转柱了,因为到这个位置是最优的。
感觉题目有锅啊。
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
const int maxn = 55;
inline int read(){
char ch = getchar();
int f = 1 , x = 0;
while(ch > '9' || ch < '0'){if(ch == '-')f = -1;ch = getchar();}
while(ch >= '0' && ch <= '9'){x = (x << 1) + (x << 3) + ch - '0';ch = getchar();}
return x * f;
}
int n,flag,x,ans;
int a[maxn],b[maxn];
void dfs(int x,int dep){
if(a[x] == dep) return;
for(int i=x-1;i>=1;i--)
dfs(i , 6 - dep - a[x]);
printf("move %d from %c to %c\n",x,a[x] + 64 , dep + 64);
a[x] = dep;
ans++;
}
int main(){
n = read();
if(n == 3){
puts("move 3 from A to B");
puts("move 1 from C to B");
puts("move 2 from C to A");
puts("move 1 from B to A");
puts("move 3 from B to C");
puts("5");
return 0;
}
flag = read();
for(int i=1;i<=flag;i++){x = read();a[x] = 1;}
flag = read();
for(int i=1;i<=flag;i++){x = read();a[x] = 2;}
flag = read();
for(int i=1;i<=flag;i++){x = read();a[x] = 3;}
flag = read();
for(int i=1;i<=flag;i++){x = read();b[x] = 1;}
flag = read();
for(int i=1;i<=flag;i++){x = read();b[x] = 2;}
flag = read();
for(int i=1;i<=flag;i++){x = read();b[x] = 3;}
for(int i=n;i>=1;i--)
dfs(i , b[i]);
printf("%d",ans);
return 0;
}
说明:本人蒟蒻,第11个hack数据至今没过,就90分的代码 + 偷偷打表(嘘)。
洛谷P1242 新汉诺塔的更多相关文章
- 洛谷P1242 新汉诺塔(dfs,模拟退火)
洛谷P1242 新汉诺塔 最开始的思路是贪心地将盘子从大到小依次从初始位置移动到目标位置. 方法和基本的汉诺塔问题的方法一样,对于盘子 \(i\) ,将盘子 \(1\to i-1\) 放置到中间柱子上 ...
- 洛谷 P1242 新汉诺塔
原题链接 题目描述 设有n个大小不等的中空圆盘,按从小到大的顺序从1到n编号.将这n个圆盘任意的迭套在三根立柱上,立柱的编号分别为A.B.C,这个状态称为初始状态. 现在要求找到一种步数最少的移动方案 ...
- 洛谷P1242 新汉诺塔 【神奇的递归】
题目描述 设有n个大小不等的中空圆盘,按从小到大的顺序从1到n编号.将这n个圆盘任意的迭套在三根立柱上,立柱的编号分别为A.B.C,这个状态称为初始状态. 现在要求找到一种步数最少的移动方案,使得从初 ...
- P1242 新汉诺塔(搜索+模拟退火)
题目链接:传送门 题目大意: 汉诺塔,给定n个盘子(n <= 45),起始状态和结束状态,求最小的步数以及路径. 思路: 考虑用dfs贪心地将剩余最大盘归位. #include<bits/ ...
- BZOJ1019 汉诺塔/洛谷P4285 [SHOI2008]汉诺塔
汉诺塔(BZOJ) P4285 [SHOI2008]汉诺塔 居然是省选题,还是DP!(我的DP菜得要死,碰见就丢分) 冥思苦想了1h+ \(\to\) ?! 就是普通的hanoi NOI or HNO ...
- P1242 新汉诺塔(hanio)
这道题加深了hanio的理解 如果我们要移动第n个盘子.那么就是说,n+1以后(包括n+1)的盘子都已经到位了 #include<iostream> #include<cstdio& ...
- P1242 新汉诺塔
题目描述 设有n个大小不等的中空圆盘,按从小到大的顺序从1到n编号.将这n个圆盘任意的迭套在三根立柱上,立柱的编号分别为A.B.C,这个状态称为初始状态. 现在要求找到一种步数最少的移动方案,使得从初 ...
- 大白_uva10795_新汉诺塔
题意:给出所有盘子的初态和终态,问最少多少步能从初态走到终态,其余规则和老汉诺塔一样. 思路: 若要把当前最大的盘子m从1移动到3,那么首先必须把剩下的所有盘子1~m-1放到2上,然后把m放到3上. ...
- UVA 10795 新汉诺塔问题
https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem& ...
随机推荐
- 【loj2586】【APIO2018】选圆圈
题目 有 \(n\) 个圆$c_1,c_2, \cdots , c_n $,执行如下的操作: 找到剩下的半径最大的圆删除并删除所有和它有交的其他并没有被删除的圆: 求每个圆是被那个圆删除的: $1 \ ...
- bzoj2758【scoi2012】Blinker的的噩梦
题目描述 一天Blinker醒来,发现自己成为了一个二维世界的点,而且被标记上了一个奇怪的值. 这个世界是由N个边界互不相交(且不相切)的图形组成,这里图形仅包括圆和凸多边形.每个图形还有一个权值.每 ...
- MySQL使用笔记(八)统计函数和分组数据记录查询
By francis_hao Dec 17,2016 统计函数数据记录查询 统计函数 统计函数 描述 count() count(*):统计表中记录条数(包括NULL值字段) count(fie ...
- poi excel导入纯数字单元格显示科学计数法的处理
POI读取Excel文件时,对纯数字单元格的处理 用POI读取Excel文件的时候,可能会遇到这样的问题:Excel文件中某一单元格中的数据为数字,例如12345678910123. 正常读取的话 ...
- Git记录-Git版本控制介绍
git config命令用于获取并设置存储库或全局选项.这些变量可以控制Git的外观和操作的各个方面. 如果在使用Git时需要帮助,有三种方法可以获得任何git命令的手册页(manpage)帮助信息: ...
- Android 利用广播接收器启动服务
public class MainActivity extends Activity { private Button bt ; protected void onCreate(Bundle save ...
- 2016/2/13 《计算机系统要素》(The Elements of Computing Systems)读书笔记(1)
过年期间一直在啃一本书,学习计算机组成原理. 这是一本很棒的书,是一个基于项目的学习过程.可以让人理解的很深刻. coursera上有这本书前半部分的教程,是由书的作者团队们开的课,个人认为很棒,可惜 ...
- BFS:八数码问题
#include <iostream> #include <cstdlib> #include <cstdio> #include <cstring> ...
- EM算法(Expectation Maximization Algorithm)
EM算法(Expectation Maximization Algorithm) 1. 前言 这是本人写的第一篇博客(2013年4月5日发在cnblogs上,现在迁移过来),是学习李航老师的< ...
- Netty接收HTTP文件上传及文件下载
文件上传 这个处理器的原理是接收HttpObject对象,按照HttpRequest,HttpContent来做处理,文件内容是在HttpContent消息带来的. 然后在HttpContent中一个 ...