﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>C++博客-qingyun.oracle-随笔分类-c++程序</title><link>http://www.cppblog.com/alvas/category/1509.html</link><description /><language>zh-cn</language><lastBuildDate>Sun, 25 May 2008 06:27:56 GMT</lastBuildDate><pubDate>Sun, 25 May 2008 06:27:56 GMT</pubDate><ttl>60</ttl><item><title>汉诺塔非递归算法</title><link>http://www.cppblog.com/alvas/archive/2006/06/07/8260.html</link><dc:creator>qingyun.oracle</dc:creator><author>qingyun.oracle</author><pubDate>Wed, 07 Jun 2006 12:29:00 GMT</pubDate><guid>http://www.cppblog.com/alvas/archive/2006/06/07/8260.html</guid><wfw:comment>http://www.cppblog.com/alvas/comments/8260.html</wfw:comment><comments>http://www.cppblog.com/alvas/archive/2006/06/07/8260.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.cppblog.com/alvas/comments/commentRss/8260.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/alvas/services/trackbacks/8260.html</trackback:ping><description><![CDATA[
		<p>汉诺塔非递归算法.我只是将盘子的数量等于2，3的情况代到网上别人给的算法中验证了一下，没有错。并没有证明算法的正确性。算法是否有效，有待大家证明。<br /><br />include &lt;iostream&gt;<br />#include &lt;stdlib.h&gt;</p>
		<p>#ifdef _WIN32<br />using namespace std;<br />#endif</p>
		<p>static void hanoi(int height)<br />{<br />    int fromPole, toPole, Disk;<br />    int *BitStr = new int[height],   //用来计算移动的盘的号码<br />        *Hold   = new int[height];   //用来存贮当前的盘的位置。hold[0]为第一个盘所在的柱号<br />    char Place[]  = {'A', 'C', 'B'};<br />    int i, j, temp;<br />  <br />    for (i=0; i &lt; height; i++)                     <br />    {<br />        BitStr[i] = 0;<br />        Hold[i] = 1;<br />    }<br />    temp = 3 - (height % 2);                      //第一个盘的柱号<br />    int TotalMoves = (1 &lt;&lt; height) - 1;<br />    for (i=1; i &lt;= TotalMoves; i++)<br />    {<br />        for (j=0 ; BitStr[j] != 0; j++)             //计算要移动的盘<br />        {<br />            BitStr[j] = 0;<br />        }<br />        BitStr[j] = 1;<br />        Disk = j+1;<br />        if (Disk == 1)<br />        {<br />            fromPole = Hold[0];<br />            toPole = 6 - fromPole - temp; //1+2+3等于6，所以6减去其它两个，剩下那个就是要移去的柱子<br />            temp = fromPole;        //保存上一次从哪个柱子移动过来的<br />        }<br />        else<br />        {<br />            fromPole = Hold[Disk-1];<br />            toPole = 6 - Hold[0] - Hold[Disk-1];<br />        }        <br />        cout &lt;&lt; "Move disk " &lt;&lt; Disk &lt;&lt; " from " &lt;&lt; Place[fromPole-1]<br />             &lt;&lt; " to " &lt;&lt; Place[toPole-1] &lt;&lt; endl;<br />        Hold[Disk-1] = toPole;<br />    }<br />}</p>
		<p> </p>
		<p>
				<br />int main(int argc, char *argv[])<br />{<br />    cout &lt;&lt; "Towers of Hanoi: " &lt;&lt; endl<br />         &lt;&lt; "moving a tower of n disks from pole A to pole B by using pole C" &lt;&lt; endl;<br />    cout &lt;&lt; "Input the height of the original tower: ";<br />    int height;<br />    cin &gt;&gt; height;<br />    hanoi(height);</p>
		<p>    system("PAUSE");<br />    return EXIT_SUCCESS;<br />}</p>
		<p> </p>
		<p>问题描述：有三个柱子A, B, C. A柱子上叠放有n个盘子，每个盘子都比它下面的盘子要小一点，可以从上</p>
		<p>到下用1, 2, ..., n编号。要求借助柱子C，把柱子A上的所有的盘子移动到柱子B上。移动条件为：1、一</p>
		<p>次只能移一个盘子；2、移动过程中大盘子不能放在小盘子上，只能小盘子放在大盘子上。</p>
		<p>算法要点有二：<br />1、确定哪一个盘子要移动。有n个盘子的Hanoi塔需要移动2^n -1次，设m为n位的二进制数，则m的取值范</p>
		<p>围为0～2^n -1。让m每次递增1，可以发现，m中最低一位的刚刚由0变为1的位置的位置编号，和即将要移</p>
		<p>动的盘子编号有确定关系。</p>
		<p>2、这个盘子往哪个柱子上移。<br />a.第一次需要移动1号盘，n为奇数时，1号盘首先移动到柱子B，为偶数时首先移动到柱子C。<br />b.接下来如果移动的盘子不是1号盘。你有两个柱子可以选择。先找到1号盘所在的柱子，因为移动的盘子</p>
		<p>不能叠放到1号盘上，所以该盘可以移动的位置就是没有1号盘的那个柱子。<br />c.如果移动的盘子是1号盘。也有两个柱子可以选择。找到1号盘原先是从哪个柱子上移来的，因为移动的</p>
		<p>顺序（顺时针或逆时针）一旦确定，就不会更改，所以排除from的那个柱子后，移动方向也就唯一了。</p>
<img src ="http://www.cppblog.com/alvas/aggbug/8260.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/alvas/" target="_blank">qingyun.oracle</a> 2006-06-07 20:29 <a href="http://www.cppblog.com/alvas/archive/2006/06/07/8260.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>