multicolorhanoitower.htm
来自「“常见程式演算”主要收集一些常见的程式练习题目」· HTM 代码 · 共 134 行
HTM
134 行
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<link rel="stylesheet" href="css/stdlayout.css" type="text/css">
<link rel="stylesheet" href="css/print.css" type="text/css">
<meta content="text/html; charset=gb2312" http-equiv="content-type">
<title>双色、三色河内塔</title>
</head>
<body>
<h3><a href="http://caterpillar.onlyfun.net/GossipCN/index.html">From
Gossip@caterpillar</a></h3>
<h1><a href="AlgorithmGossip.htm">Algorithm Gossip: 双色、三色河内塔</a></h1>
<h2>说明</h2>
双色河内塔与三色河内塔是由之前所介绍过的河内塔规则衍生而来,双色河内塔的目的是将下图左上的圆环位置经移动成为右下的圆环位置: <br>
<div style="text-align: center;"><img style="width: 381px; height: 141px;" alt="多色河内塔" title="多色河内塔" src="images/multiColorHanoiTower-1.jpg"><br>
<br>
<div style="text-align: left;">而三色河内塔则是将下图左上的圆环经移动成为右上的圆环: <br>
<div style="text-align: center;"><img style="width: 381px; height: 141px;" alt="多色河内塔" title="多色河内塔" src="images/multiColorHanoiTower-2.jpg"><br>
</div>
<br>
在移动的过程中,一样遵守大盘必须在小盘之下的规则,而颜色顺序则无限制。
<h2> 解法</h2>
无论是双色河内塔或是三色河内塔,其解法观念与之前介绍过的河内塔是类似的,同样也是使用递回来解,不过这次递回解法的目的不同,我们先来看只有两个
盘的情况,这很简单,只要将第一柱的黄色移动至第二柱,而接下来第一柱的蓝色移动至第三柱。 <br>
<br>
再来是四个盘的情况,首先必须用递回完成下图左上至右下的移动: <br>
<div style="text-align: center;"><img style="width: 378px; height: 137px;" alt="多色河内塔" title="多色河内塔" src="images/multiColorHanoiTower-3.jpg"></div>
<br>
接下来最底层的就不用管它们了,因为它们已经就定位,只要再处理第一柱的上面两个盘子就可以了。<br>
<br>
那么六个盘的情况呢?一样!首先必须用递回完成下图左上至右下的移动: <br>
<div style="text-align: center;"><img style="width: 377px; height: 137px;" alt="多色河内塔" title="多色河内塔" src="images/multiColorHanoiTower-4.jpg"></div>
<br>
接下来最底层的就不用管它们了,因为它们已经就定位,只要再处理第一柱上面的四个盘子就可以了,这又与之前只有四盘的情况相同,接下来您就知道该如何进行解题了,无论是八个盘、十个盘以上等,都是用这个观念来解题。<br>
<br>
那么三色河内塔呢?一样,直接来看九个盘的情况,首先必须完成下图的移动结果:<br>
<div style="text-align: center;"><img style="width: 226px; height: 63px;" alt="多色河内塔" title="多色河内塔" src="images/multiColorHanoiTower-5.jpg"><br>
</div>
<br>
接下来最底两层的就不用管它们了,因为它们已经就定位,只要再处理第一柱上面的三个盘子就可以了。<br>
<div style="text-align: center;"><img style="width: 223px; height: 62px;" alt="多色河内塔" title="多色河内塔" src="images/multiColorHanoiTower-6.jpg"></div>
<br>
您也可以看看 <a href="http://obelix.ee.duth.gr/%7Eapostolo/TowersOfHanoi/index.html">Towers of Hanoi Page</a> 中有关于河内塔的讨论。<br>
<h2> 实作</h2>
以下Java演算实例由 <a href="http://www.javaworld.com.tw">http://www.javaworld.com.tw</a> 的 <a href="http://www.javaworld.com.tw/jute/user/info?uid=3056">T5555</a> 提供,感谢他的协助,我根据他的实例,转换为C语言的实作部份,您可以参考这个 <a href="http://www.javaworld.com.tw/jute/post/view?bid=29&id=81268&tpg=1&ppg=1&sty=0&age=0#81268">讨论串</a> 有关于河内塔的讨论。<br>
<br>
<ul>
<li> 双色河内塔 C 实作
</li>
</ul>
<pre>#include <stdio.h><br><br>void hanoi(int disks, char source, char temp, char target) {<br> if (disks == 1) {<br> printf("move disk from %c to %c\n", source, target);<br> printf("move disk from %c to %c\n", source, target);<br> } else {<br> hanoi(disks-1, source, target, temp);<br> hanoi(1, source, temp, target);<br> hanoi(disks-1, temp, source, target);<br> }<br>}<br><br>void hanoi2colors(int disks) {<br> char source = 'A';<br> char temp = 'B';<br> char target = 'C';<br> int i;<br> for(i = disks / 2; i > 1; i--) {<br> hanoi(i-1, source, temp, target);<br> printf("move disk from %c to %c\n", source, temp);<br> printf("move disk from %c to %c\n", source, temp);<br> hanoi(i-1, target, temp, source);<br> printf("move disk from %c to %c\n", temp, target);<br> }<br> printf("move disk from %c to %c\n", source, temp);<br> printf("move disk from %c to %c\n", source, target);<br>}<br><br>int main() {<br> int n;<br> printf("请输入盘数:");<br> scanf("%d", &n);<br><br> hanoi2colors(n);<br><br> return 0;<br>} <br></pre>
<br>
<ul>
<li> 三色河内塔 C 实作
</li>
</ul>
<pre>#include <stdio.h><br><br>void hanoi(int disks, char source, char temp, char target) {<br> if (disks == 1) {<br> printf("move disk from %c to %c\n", source, target);<br> printf("move disk from %c to %c\n", source, target);<br> printf("move disk from %c to %c\n", source, target);<br> } else {<br> hanoi(disks-1, source, target, temp);<br> hanoi(1, source, temp, target);<br> hanoi(disks-1, temp, source, target);<br> }<br>}<br><br>void hanoi3colors(int disks) {<br> char source = 'A';<br> char temp = 'B';<br> char target = 'C';<br> int i;<br><br> if(disks == 3) {<br> printf("move disk from %c to %c\n", source, temp);<br> printf("move disk from %c to %c\n", source, temp);<br> printf("move disk from %c to %c\n", source, target);<br> printf("move disk from %c to %c\n", temp, target);<br> printf("move disk from %c to %c\n", temp, source);<br> printf("move disk from %c to %c\n", target, temp);;<br> }<br> else {<br> hanoi(disks/3-1, source, temp, target);<br> printf("move disk from %c to %c\n", source, temp);<br> printf("move disk from %c to %c\n", source, temp);<br> printf("move disk from %c to %c\n", source, temp);<br><br> hanoi(disks/3-1, target, temp, source);<br> printf("move disk from %c to %c\n", temp, target);<br> printf("move disk from %c to %c\n", temp, target);<br> printf("move disk from %c to %c\n", temp, target);<br><br> hanoi(disks/3-1, source, target, temp);<br> printf("move disk from %c to %c\n", target, source);<br> printf("move disk from %c to %c\n", target, source);<br><br> hanoi(disks/3-1, temp, source, target);<br> printf("move disk from %c to %c\n", source, temp);<br> <br> for (i = disks / 3 - 1; i > 0; i--) {<br> if (i>1) {<br> hanoi(i-1, target, source, temp);<br> }<br><br> printf("move disk from %c to %c\n",<br> target, source);<br> printf("move disk from %c to %c\n",<br> target, source);<br><br> if (i>1) {<br> hanoi(i-1, temp, source, target);<br> }<br> printf("move disk from %c to %c\n", <br> source, temp);<br> }<br> }<br>}<br><br>int main() {<br> int n;<br> printf("请输入盘数:");<br> scanf("%d", &n);<br><br> hanoi3colors(n);<br><br> return 0;<br>} <br></pre>
<br>
<ul>
<li> 双色河内塔 Java 实作
</li>
</ul>
<pre>public class Hanoi2Colors { <br> public static void help() {<br> System.out.println(<br> "Usage: java Hanoi2Colors number_of_disks");<br> System.out.println(<br> "\t number_of_disks: must be a even number.");<br> System.exit(0);<br> }<br> <br> public static void main(String[] args) {<br> int disks = 0; <br> try {<br> disks = Integer.parseInt(args[0]);<br> } catch (Exception e) {<br> help();<br> }<br> if ((disks <= 0) || (disks % 2 != 0)) { <br> help(); <br> }<br> hanoi2colors(disks);<br> }<br> <br> public static void hanoi(int disks, <br> char source, char temp, char target) {<br> if (disks == 1) {<br> System.out.println("move disk from " <br> + source + " to " + target);<br> System.out.println("move disk from " <br> + source + " to " + target);<br> } else { <br> hanoi(disks-1, source, target, temp);<br> hanoi(1, source, temp, target);<br> hanoi(disks-1, temp, source, target);<br> }<br> }<br> <br> public static void hanoi2colors(int disks) {<br> char source = 'A';<br> char temp = 'B';<br> char target = 'C';<br> for (int i = disks / 2; i > 1; i--) {<br> hanoi(i-1, source, temp, target);<br> System.out.println("move disk from " <br> + source + " to " + temp);<br> System.out.println("move disk from " <br> + source + " to " + temp); <br> hanoi(i-1, target, temp, source);<br> System.out.println("move disk from " <br> + temp + " to " + target);<br> }<br> System.out.println("move disk from " <br> + source + " to " + temp);<br> System.out.println("move disk from " <br> + source + " to " + target);<br> }<br>} <br></pre>
<br>
<ul>
<li> 三色河内塔 Java 实作
</li>
</ul>
<pre>public class Hanoi3Colors { <br> public static void help() {<br> System.out.println(<br> "Usage: java Hanoi3Colors number_of_disks");<br> System.out.println(<br> "\tnumber_of_disks: must be a number divisible by 3.");<br> System.exit(0);<br> }<br> <br> public static void main(String[] args) {<br> int disks = 0; <br> try {<br> disks = Integer.parseInt(args[0]);<br> } catch (Exception e) {<br> help();<br> }<br> if ((disks <= 0) || (disks % 3 != 0)) { <br> help(); <br> }<br> hanoi3colors(disks);<br> }<br> <br> public static void hanoi(int disks, <br> char source, char temp, char target) {<br> if (disks == 1) {<br> System.out.println("move disk from " <br> + source + " to " + target);<br> System.out.println("move disk from "<br> + source + " to " + target);<br> System.out.println("move disk from "<br> + source + " to " + target);<br> } else { <br> hanoi(disks-1, source, target, temp);<br> hanoi(1, source, temp, target);<br> hanoi(disks-1, temp, source, target);<br> }<br> }<br> <br> public static void hanoi3colors(int disks) {<br> char source = 'A';<br> char temp = 'B';<br> char target = 'C';<br> if (disks == 3) {<br> System.out.println("move disk from " <br> + source + " to " + temp);<br> System.out.println("move disk from " <br> + source + " to " + temp);<br> System.out.println("move disk from " <br> + source + " to " + target);<br> System.out.println("move disk from " <br> + temp + " to " + target);<br> System.out.println("move disk from " <br> + temp + " to " + source);<br> System.out.println("move disk from " <br> + target + " to " + temp);<br> } else {<br> hanoi(disks/3-1, source, temp, target);<br> System.out.println("move disk from " <br> + source + " to " + temp);<br> System.out.println("move disk from " <br> + source + " to " + temp);<br> System.out.println("move disk from " <br> + source + " to " + temp);<br> hanoi(disks/3-1, target, temp, source);<br> System.out.println("move disk from " <br> + temp + " to " + target);<br> System.out.println("move disk from "<br> + temp + " to " + target);<br> System.out.println("move disk from "<br> + temp + " to " + target);<br> hanoi(disks/3-1, source, target, temp);<br> System.out.println("move disk from " <br> + target + " to " + source);<br> System.out.println("move disk from " <br> + target + " to " + source);<br> hanoi(disks/3-1, temp, source, target);<br> System.out.println("move disk from " <br> + source + " to " + temp);<br> <br> for (int i = disks / 3 - 1; i > 0; i--) {<br> if (i>1) { <br> hanoi(i-1, target, source, temp); <br> }<br> System.out.println("move disk from " <br> + target + " to " + source);<br> System.out.println("move disk from " <br> + target + " to " + source);<br> if (i>1) { <br> hanoi(i-1, temp, source, target); <br> }<br> System.out.println("move disk from " <br> + source + " to " + temp);<br> }<br> }<br> }<br>} </pre>
<br>
</div>
</div>
</body>
</html>
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?