●漢諾塔算法的非遞歸實現C++源代碼
#包括iostream
使用命名空間std
最大磁盤數量為64個。
const int MAX = 64
用於表示每列的信息。
結構st{
int s[MAX];列上的磁盤存儲
int top棧頂,用於最上面的磁盤。
字符名稱;列的名稱可以是A、B和c中的壹個。
Int Top()獲取棧頂元素。
{
return s[top];
}
Int Pop()超出堆棧。
{
return s[top –];
}
Void推入堆棧(int x)
{
s[++ top]= x;
}
} ;
long Pow(int x,int y);計算x y
void Creat(st ta[],int n);設置結構數組的初始值。
void漢諾塔(st ta[],long max);河內移動塔的主要功能
int main(void)
{
int n;
CIN n;輸入磁盤數量。
ST ta[3];三個支柱的信息存儲在結構數組中。
Creat(ta,n);設置結構數組的初始值。
long max = Pow(2,n)-1;移動的次數應該等於2 n-1。
漢諾塔(ta,max);河內移動塔的主要功能
系統(“暫停”);
返回0;
}
空創建(st ta[],int n)
{
ta[0]。name = ' A
ta[0]。top = n-1;
按照從大到小的順序將所有磁盤放在A列上。
for(int I = 0;在;i++)
ta[0]。s[I]= n-I;
B柱和c柱上壹開始沒有圓盤。
ta[1]。top = ta[2]。top = 0;
for(int I = 0;在;i++)
ta[1]。s[i] = ta[2]。s[I]= 0;
如果n是偶數,順時針方向依次放壹個B C。
如果(n%2 == 0)
{
ta[1]。name = ' B
ta[2]。name = ' C
}
否則如果n是奇數,順時針依次放A C B。
{
ta[1]。name = ' C
ta[2]。name = ' B
}
}
長冪(整數x,整數y)
{
長和= 1;
for(int I = 0;iy;i++)
sum = x;
返回總和;
}
無效漢諾塔(st ta[],long max)
{
int k = 0;累計移動次數
int I = 0;
int ch
白色(k最大值)
{
將圓盤1從當前列順時針移動到下壹列。
ch = ta[i%3]。pop();
ta[(i+1)%3]。推(ch);
cout ++k " "
將磁盤“ch”從“ta[i%3]中移動。名字
" to " ta[(i+1)%3]。名字endl
i++;
將另外兩列上的可移動磁盤移到新列中。
中頻(k最大值)
{
將非空列上的光盤移到空列。當兩列都為空時,移動較小的光盤。
if (ta[(i+1)%3]。Top() == 0
ta[(i-1)%3]。top()0 & amp;& amp
ta[(i+1)%3]。Top() ta[(i-1)%3]。Top())
{
ch = ta[(i-1)%3]。pop();
ta[(i+1)%3]。推(ch);
cout ++k " " "移動磁盤"
ch " from " ta[(i-1)%3]。名字
" to " ta[(i+1)%3]。名字endl
}
其他
{
ch = ta[(i+1)%3]。pop();
ta[(i-1)%3]。推(ch);
cout ++k " " "移動磁盤"
ch " from " ta[(i+1)%3]。名字
" to " ta[(i-1)%3]。名字endl
}
}
}
}