ZOJ-2338 The Towers of Hanoi Revisited 输出汉诺塔的最优解移动过程
题意:给定N(1<= N <=64)个盘子和M(4<= M <= 65)根柱子,问把N个盘子从1号柱子移动到M号柱子所需要的最少步数,并且输出移动过程。
分析:设f[i][j]表示将i个盘通过j个柱子从第一根柱子移动到最后一根柱子所需要的最少次数,f[i][j]的得到的最优移动方案是先将最小的path[i][j]个盘移动到某一根柱子上,然后通过一个dfs输出移动次序。
#include <cstdlib>
#include <cstring>
#include <cstdio>
#include <stack>
#include <algorithm>
using namespace std; typedef unsigned long long LL;
const int N = ;
LL f[][];
// f[i][j]表示将i个盘通过j个柱子从第一根柱子移动到最后一根柱子所需要的最少次数
int path[][]; // 表示f[i][j]的得到的最优移动方案是先将最小的path[i][j]个盘移动到某一根柱子上
int n, m;
stack<int>stk[];
char ocp[]; void pre() {
memset(f, 0x3f, sizeof (f));
for (int i = ; i <= ; ++i) {
f[][i] = ;
f[][i] = ;
}
for (int i = ; i <= ; ++i) { // 初始化三根柱子的情况
f[i][] = f[i-][] * + ;
path[i][] = i-;
}
for (int i = ; i <= ; ++i) {
for (int j = ; j <= ; ++j) {
for (int k = ; k < i; ++k) {
if (f[i][j] > f[i-k][j-] + *f[k][j]) {
f[i][j] = f[i-k][j-] + *f[k][j];
path[i][j] = k;
}
}
}
}
}
/*
move 2 from 1 to 2
move 1 from 3 to 2 atop 2
*/ void display(int an, int am, int sta, int end) {
if (an == ) {
if (stk[end].size()) {
printf("move %d from %d to %d atop %d\n", stk[sta].top(), sta, end, stk[end].top());
} else {
printf("move %d from %d to %d\n", stk[sta].top(), sta, end);
}
stk[end].push(stk[sta].top());
stk[sta].pop();
return;
}
int peg = ;
for (int i = ; i <= m; ++i) {
if (i != sta && i != end && !ocp[i]) {
peg = i;
break;
}
}
display(path[an][am], am, sta, peg);
ocp[peg] = ;
display(an-path[an][am], am-, sta, end);
ocp[peg] = ;
display(path[an][am], am, peg, end);
} void solve() {
for (int i = ; i <= m; ++i) while (!stk[i].empty()) stk[i].pop();
for (int i = n; i >= ; --i) stk[].push(i);
memset(ocp, , sizeof (ocp));
printf("%llu\n", f[n][m]);
display(n, m, , m);
} int main() {
pre();
int T;
scanf("%d", &T);
while (T--) {
scanf("%d %d", &n, &m);
solve();
}
return ;
}
ZOJ-2338 The Towers of Hanoi Revisited 输出汉诺塔的最优解移动过程的更多相关文章
- zoj 2338 The Towers of Hanoi Revisited
The Towers of Hanoi Revisited Time Limit: 5 Seconds Memory Limit: 32768 KB Special Judge You all mus ...
- 1223: 输出汉诺塔问题的盘子移动步骤(Java)
一.题目 http://acm.wust.edu.cn/problem.php?id=1223&soj=0 二.代码 import java.util.*; public class Main ...
- 汉诺塔-Hanoi
1. 问题来源: 汉诺塔(河内塔)问题是印度的一个古老的传说. 法国数学家爱德华·卢卡斯曾编写过一个印度的古老传说:在世界中心贝拿勒斯(在印度北部)的圣庙里,一块黄铜板上插着三根宝石针.印度教的主神梵 ...
- hanoi(汉诺塔)递归实现
汉诺塔:汉诺塔(又称河内塔)问题是源于印度一个古老传说的益智玩具.大梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上按照大小顺序摞着64片黄金圆盘.大梵天命令婆罗门把圆盘从下面开始按大小顺序 ...
- SGU 202 The Towers of Hanoi Revisited (DP+递归)
转载请注明出处,谢谢http://blog.csdn.net/ACM_cxlove?viewmode=contents by---cxlove 题意 :n个圆盘,m个柱子的汉诺塔输出步骤. ht ...
- [CareerCup] 3.4 Towers of Hanoi 汉诺塔
3.4 In the classic problem of the Towers of Hanoi, you have 3 towers and N disks of different sizes ...
- 《hanoi(汉诺塔)问题》求解
//Hanoi(汉诺)塔问题.这是一个古典的数学问题,用递归方法求解.问题如下: /* 古代有一个梵塔,塔内有3个座A,B,C,开始时A座上有64个盘子,盘子大小不等,大的在下,小的在上. 有一个老和 ...
- 汉诺塔 Hanoi Tower
电影<猩球崛起>刚开始的时候,年轻的Caesar在玩一种很有意思的游戏,就是汉诺塔...... 汉诺塔源自一个古老的印度传说:在世界的中心贝拿勒斯的圣庙里,一块黄铜板上插着三支宝石针.印度 ...
- [js - 算法可视化] 汉诺塔(Hanoi)演示程序
前段时间偶然看到有个日本人很早之前写了js的多种排序程序,使用js+html实现的排序动画,效果非常好. 受此启发,我决定写几个js的算法动画,第一个就用汉诺塔. 演示地址:http://tut.ap ...
随机推荐
- Dynamics AX 2012 R2 在增强入站端口中找不到自定义服务操作
Reinhard写好自定义服务A,添加好服务操作A1,A2,A3..... 然后,Reinhard在增强的入站端口,选择服务操作时,却找不到这些A1,A2,A3. 查找相关资料 ...
- Docker CPU 资源限制——CPU分片功能测试
之前的一篇随笔——Docker CPU 资源限制 中介绍了针对COU的某个或某几个核的控制,今天介绍下CPU分片功能,即CPU占比. 测试步骤 1.下载CPU测试image.agileek/cpuse ...
- Docker Centos安装Openssh
环境介绍: Docker版本:1.5.0 镜像:docker.io:centos latest 操作步骤: 1.启动镜像 docker run -ti centos /bin/bash 2.安装pas ...
- PG_RMAN备份遇到 domain socket
在用pg_rman做数据全备时:出现异常错误! [postgres@sdserver40_210 run]$ pg_rman backup --backup-mode=full --progress ...
- JS删除script标签
可以试试以下方法 var deleteJs = document.getElementById('xxx'); var otherJs = document.getElementsByTagName( ...
- JAVA基础知识之网络编程——-关于阻塞IO/非阻塞IO/同步IO/异步IO的一些参考文章
Java NIO之多个Selector的实现Java NIO类库Selector机制解析(上) Java NIO类库Selector机制解析(下) https://www.zhihu.com/ques ...
- sys模块的初步认识
#!/usr/bin/python # Filename: cat.py import sys def readfile(filename): '''Print a file to the stand ...
- Spring.Net 技术简介 IOC and DI
一 简单介绍 IOC 控制转移,就是将创建放到容器里,从而达到接耦合的目的,DI是 在容器创建对象的时候,DI读取配置文件,然后给对象赋默认值,两者一般结合使用,实现注入. ...
- 如何从MySQL官方Yum仓库安装MySQL5.6
(一),2013年10月,MySQL开发团队正式宣布支持Yum仓库,这就意味着我们现在可以从这个Yum库中获得最新和最优版的MySQL安装包.本文将在一台全新安装的CentOS6上安装MySQL5.6 ...
- Statement和PreparedStatement批量更新
优势:1.节省传递时间. 2.并发处理. PreparedStatement: 1) addBatch()将一组参数添加到PreparedStatement对象内部. 2) executeBatch( ...