[英]Hanoi Towers - iterative, using lists
我想使用3根桿和n個光盤編寫標准的河內塔算法。 但是我也想學習如何使用列表,所以我想可以結合使用。
我考慮過創建3個元素,每個元素代表一個桿。 它們中的每一個都將具有discs[]
數組,例如,如果桿將具有5個光盤,則該數組將包含[1, 2, 3, 4, 5]
元素。
好的,我實現了結構等,但是我的問題是-如何實際解決河內塔的迭代問題?
可以在桿上循環,然后檢查每個碟片的位置,然后將其移動到第一個檢查的位置,然后重復該循環嗎?
列表不必讓您的生活變得過於復雜。 使用數組。
#include <stdio.h>
#define DISKS 4 // 10 max
int stacks[3][DISKS];
int sps[3];
void init(int from)
{
int i;
sps[2] = sps[1] = sps[0] = 0;
for (i = 0; i < DISKS; i++)
stacks[from][i] = DISKS - i; // disk radius
sps[from] = DISKS;
}
void print(void)
{
int i, j, k;
for (i = DISKS - 1; i >= 0; i--)
{
for (j = 0; j < 3; j++)
{
if (sps[j] > i)
{
for (k = 0; k < 10 - stacks[j][i]; k++)
printf(" ");
for (k = 0; k < 2 * stacks[j][i]; k++)
printf("x");
for (k = 0; k < 10 - stacks[j][i]; k++)
printf(" ");
}
else
{
printf(" "); // 10 * 2
}
printf(" ");
}
printf("\n");
}
printf("_________/\\_________ _________/\\_________ _________/\\_________\n\n");
}
void solve(int to, int from, int cnt)
{
int other = from ^ to ^ 3;
if (!cnt) return;
solve(other, from, cnt - 1);
stacks[to][sps[to]++] = stacks[from][--sps[from]];
print();
solve(to, other, cnt - 1);
}
int main(void)
{
init(0);
print();
solve(2, 0, DISKS);
return 0;
}
輸出( ideone ):
xx
xxxx
xxxxxx
xxxxxxxx
_________/\_________ _________/\_________ _________/\_________
xxxx
xxxxxx
xxxxxxxx xx
_________/\_________ _________/\_________ _________/\_________
xxxxxx
xxxxxxxx xx xxxx
_________/\_________ _________/\_________ _________/\_________
xxxxxx xx
xxxxxxxx xxxx
_________/\_________ _________/\_________ _________/\_________
xx
xxxxxxxx xxxxxx xxxx
_________/\_________ _________/\_________ _________/\_________
xx
xxxxxxxx xxxxxx xxxx
_________/\_________ _________/\_________ _________/\_________
xx xxxx
xxxxxxxx xxxxxx
_________/\_________ _________/\_________ _________/\_________
xx
xxxx
xxxxxxxx xxxxxx
_________/\_________ _________/\_________ _________/\_________
xx
xxxx
xxxxxx xxxxxxxx
_________/\_________ _________/\_________ _________/\_________
xxxx xx
xxxxxx xxxxxxxx
_________/\_________ _________/\_________ _________/\_________
xx
xxxx xxxxxx xxxxxxxx
_________/\_________ _________/\_________ _________/\_________
xx
xxxx xxxxxx xxxxxxxx
_________/\_________ _________/\_________ _________/\_________
xx xxxxxx
xxxx xxxxxxxx
_________/\_________ _________/\_________ _________/\_________
xxxxxx
xxxx xx xxxxxxxx
_________/\_________ _________/\_________ _________/\_________
xxxx
xxxxxx
xx xxxxxxxx
_________/\_________ _________/\_________ _________/\_________
xx
xxxx
xxxxxx
xxxxxxxx
_________/\_________ _________/\_________ _________/\_________
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.