汉诺塔非递归算法.我只是将盘子的数量等于2,3的情况代到网上别人给的算法中验证了一下,没有错。并没有证明算法的正确性。算法是否有效,有待大家证明。 \ZSq ZDq
:[C|3KKe"
include <iostream> M,r8 No
#include <stdlib.h> ^%U`|GBZp
Y$ KR\ m
#ifdef _WIN32 :pvVm>
using namespace std; zf\$T,t)
#endif &!+1GI9z
|$GPJaNqa
static void hanoi(int height) BISH34
{ S[l z>I
int fromPole, toPole, Disk; P|;v >
int *BitStr = new int[height], //用来计算移动的盘的号码 J0t_wMJa
*Hold = new int[height]; //用来存贮当前的盘的位置。hold[0]为第一个盘所在的柱号 }n,LvA@[0
char Place[] = {'A', 'C', 'B'}; :prx:7
int i, j, temp; 6>'>BamX
}Os7[4RW
for (i=0; i < height; i++) L5wFbc"u
{ zP$"6~.
BitStr = 0; 4~d:@Gmk&
Hold = 1; #=F{G4d)!=
} _Q b].~
temp = 3 - (height % 2); //第一个盘的柱号 -(#`JT8
int TotalMoves = (1 << height) - 1; >Gvd?r
for (i=1; i <= TotalMoves; i++) )L"J?wTe
{ [XP\WG>s
for (j=0 ; BitStr[j] != 0; j++) //计算要移动的盘 l5enlYH
{ IY@N
BitStr[j] = 0; ,GtN6?
} 1CUI6@Cz)
BitStr[j] = 1; >5t]Zlb`
Disk = j+1; pT:6A[&
if (Disk == 1) N=@8~{V.
{ 3Z}KRsp3
fromPole = Hold[0]; i`w&{WTRQ
toPole = 6 - fromPole - temp; //1+2+3等于6,所以6减去其它两个,剩下那个就是要移去的柱子 _|COnm
temp = fromPole; //保存上一次从哪个柱子移动过来的 HeHo?<>|d
} :?)q"hE
else H[?l)nZ}
{ hu~XFRw15
fromPole = Hold[Disk-1];
Q 9<i2H
toPole = 6 - Hold[0] - Hold[Disk-1]; hXc:y0
0
} Bv7os3xb
cout << "Move disk " << Disk << " from " << Place[fromPole-1] bhW&,"$Z
<< " to " << Place[toPole-1] << endl; <^e
Hold[Disk-1] = toPole; +rDKx(Rk
} kr44@!s+'
} FJsM3|{2=d
QghL=
H 9?txNea
Jg6@)<n
;"NW=P&
int main(int argc, char *argv[]) * YLpC^&
{ d(, M
cout << "Towers of Hanoi: " << endl Z3 dI
B`@
<< "moving a tower of n disks from pole A to pole B by using pole C" << endl; H_u%e*W
cout << "Input the height of the original tower: "; YizwKcuZ
int height; Se!B,'C%
cin >> height; jGDuKb@:
hanoi(height); PJ)d5D%T
%^iBTfq2hc
system("PAUSE"); aM\Ph&c7e'
return EXIT_SUCCESS; |O*?[|`H
} ,,h>_IA
h0-CTPQ7A
'pT8S
c:-n0m'i
问题描述:有三个柱子A, B, C. A柱子上叠放有n个盘子,每个盘子都比它下面的盘子要小一点,可以从上 V~QOl=`K:
W: 3fLXk+
到下用1, 2, ..., n编号。要求借助柱子C,把柱子A上的所有的盘子移动到柱子B上。移动条件为:1、一 4CxU
eq
S6{y%K2y&
次只能移一个盘子;2、移动过程中大盘子不能放在小盘子上,只能小盘子放在大盘子上。 e#ne 5
U;Yw\&R