洛谷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& ...
随机推荐
- Web前端之Javascript详解20180330
一.javascript概述 javascript是基于对象和事件的脚本语言. 特点: 1.安全性(不允许直接访问本地硬盘(因为是被远程的浏览器解释)),它可以做的就是信息的动态交互 2.跨平台性(只 ...
- 2.Helloworld
1.对于Qt程序来说,main()函数一般以创建application对象(gui是QApplication,非gui程序是QCoreApplication.QApplication实际上是QCore ...
- awk 脚本同时解析多个文件
ARGC The number of command line arguments (does not include options to gawk ...
- linux tmux命令小结
http://note.youdao.com/noteshare?id=f1be507b4be27e53684b46a1424746b5
- 编程语言教程书该怎么写: 向K&R学习!
原文地址:Lax Language TutorialsAndrew Binstock 每年在评审Jolt Awards图书的时候,我都会被一些语言教程类图书弄得心力交瘁.从这些年的评审经验来看,这些语 ...
- python 中__getitem__ 和 __iter__ 的区别
# -*- coding: utf-8 -*- class Library(object): def __init__(self): self.books = { 'title' : 'a', 'ti ...
- 科学计算三维可视化---Mayavi入门(Mayavi介绍和安装)
Mayavi介绍 是基于VTK开发的可视化软件(更加高效),Mayavi完全由python编写,方便使用,而且可以使用python编写扩展,嵌入到用户程序中 安装要求 VTK >pip3 ins ...
- uboot常用命令详解
dnw:在进入系统之前进入指令行,输入该指令可下载烧录文件. re:重新启动嵌入式系统. printenv:打印当前系统环境变量. setenv:设置环境变量,格式:setenv name value ...
- 二分算法的应用——Codevs 1766 装果子
#include<iostream> #include<cstdio> using namespace std; + ; typedef long long LL; LL a[ ...
- BFS搜索:POJ No 3669 Meteor Shower
#include <iostream> #include <cstring> #include <queue> #include <cstdio> #i ...