博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
The Towers of Hanoi Revisited---(多柱汉诺塔)
阅读量:5115 次
发布时间:2019-06-13

本文共 3523 字,大约阅读时间需要 11 分钟。

Description

      You all must know the puzzle named "The Towers of Hanoi". The puzzle has three pegs and N discs of different radii, initially all disks are located on the first peg, ordered by their radii - the largest at the bottom, the smallest at the top. In a turn you may take the topmost disc from any peg and move it to another peg, the only rule says that you may not place the disc atop any smaller disk. The problem is to move all disks to the last peg making the smallest possible number of moves.

      There is the legend that somewhere in Tibet there is a monastery where monks tirelessly move disks from peg to peg solving the puzzle for 64 discs. The legend says that when they finish, the end of the world would come. Since it is well known that to solve the puzzle you need to make 2N - 1 moves, a small calculation shows that the world seems to be a quite safe place for a while.

      However, recent archeologists discoveries have shown that the things can be a bit worse. The manuscript found in Tibet mountains says that the puzzle the monks are solving has not 3 but M pegs. This is the problem, because when increasing the number of pegs, the number of moves needed to move all discs from the first peg to the last one following the rules described, decreases dramatically. Calculate how many moves one needs to move N discs from the first peg to the last one when the puzzle has M pegs and provide the scenario for moving the discs.

Input

      Input file contains N and M 
(1 ≤ N ≤ 64, 4 ≤ M ≤ 65).

Output

      On the first line output L - the number of moves needed to solve the puzzle. Next L lines must contain the moves themselves. For each move print the line of the form

move <disc-radius> from <source-peg> to <target-peg>

if the disc is moved to the empty peg or

move <disc-radius> from <source-peg> to <target-peg> atop <target-top-disc-radius>

if the disc is moved atop some other disc.

      Disc radii are integer numbers from 1 to N, pegs are numbered from 1 to M.

Sample Input

5 4

Sample Output

13move 1 from 1 to 3move 2 from 1 to 2move 1 from 3 to 2 atop 2move 3 from 1 to 4move 4 from 1 to 3move 3 from 4 to 3 atop 4move 5 from 1 to 4move 3 from 3 to 1move 4 from 3 to 4 atop 5move 3 from 1 to 4 atop 4move 1 from 2 to 1move 2 from 2 to 4 atop 3move 1 from 1 to 4 atop 2
#include 
#include
#include
#include
#include
#include
using namespace std;const int MAXN = 1e2+5;const double eps = 1e-9;const int INF = 1e8+5;int f[MAXN][MAXN], p[MAXN][MAXN];///f:步数 p:节点void get(int n, int k){ if(f[n][k] != -1) return; f[n][k] = INF; if(k < 3) return; for(int m=1; m
tp) { f[n][k] = tp; p[n][k] = m; } }}int n, m;int hanoi[MAXN][MAXN], num[MAXN];void print(int s, int t, int a, int b){ if(a == 1) { printf("move %d from %d to %d ",hanoi[s][num[s]]+1,s,t); if(num[t]) printf("atop %d",hanoi[t][num[t]]+1); puts(""); num[t]++; hanoi[t][num[t]]=hanoi[s][num[s]--]; return; } for(int i=1; i<=m; i++) { if(i!=s && i!=t) { if(hanoi[i][num[i]] > hanoi[s][num[s]-p[a][b]+1]) { print(s, i, p[a][b], b); print(s, t, a-p[a][b], b-1); print(i, t, p[a][b], b); return; } } } return ;}int main(){ while(cin>>n>>m) { memset(f, -1, sizeof(f)); for(int i=1; i<=m; i++) f[1][i] = 1; get(n, m); cout<
<
=1; i--) { hanoi[1][num[1]] = i; num[1]++; } for(int i=1; i<=m; i++) hanoi[i][0] = INF; print(1, m, n, m); } return 0;}

 

转载于:https://www.cnblogs.com/chen9510/p/5539311.html

你可能感兴趣的文章
Windows 7丢失用户、密码解决办法-我体验了!
查看>>
说说qwerty、dvorak、colemak三种键盘布局
查看>>
怎么SDCard上的获取相册照片
查看>>
人民币符号是什么 人民币符号怎么打
查看>>
《Spring技术内幕》学习笔记17——Spring HTTP调用器实现远程调用
查看>>
Sqoop导入HBase,并借助Coprocessor协处理器同步索引到ES
查看>>
Eclipse中JSP生成的class文件去了哪里?(转)
查看>>
leetcode-longestPalindrome-java
查看>>
MySQL-事务
查看>>
内存增长 避免
查看>>
mysql使用utf8mb4经验吐血总结
查看>>
VScode-Go can't load package: package .: no buildable Go source files in
查看>>
c语言编译过程解析
查看>>
JavaScript:学习笔记(3)——正则表达式的应用
查看>>
LeetCode:旋转链表【61】
查看>>
浮点数转化为字符串
查看>>
ssRs父子维度
查看>>
关押罪犯
查看>>
SUSE Labs Con 2018有感
查看>>
Jquery基础概括
查看>>