gpt4 book ai didi

c++ - 汉诺塔 [编辑] - k peg 解决方案

转载 作者:行者123 更新时间:2023-11-28 00:53:56 26 4
gpt4 key购买 nike

我能够想出一个算法(合乎逻辑的)来解决汉诺塔问题的 k-peg 解决方案,但是当我实现我的代码时,我遇到了段错误。

void move(int number_of_disks, int source, int dest, vector <int> free_peg, int pointer)
{
int p;

if (1 == number_of_disks)
{
moves++;
move_top_disk (source, dest);
}

if(free_peg.size() > 2)
p = number_of_disks/2;
else
p = number_of_disks - 1;

moves++;
//Move top "p" disks from peg 1 to peg i
move(p, source, free_peg.back(),free_peg, pointer);
//Move "n - p - 1" disks from peg 1 to another peg
move(number_of_disks - p - 1, source, free_peg[pointer--], free_peg, pointer++);
//Move the "last disk" from the source peg to the destination
move_top_disk(source, dest);
//Move "n - p - 1" disks from peg (i - 1) to the final peg
move(number_of_disks - p - 1, free_peg[pointer--], dest, free_peg, pointer++);
//Move "p" disks from peg i to the destination
move(p, free_peg.back(), dest, free_peg, pointer);
}

这个想法非常简单,我保留了一个免费的钉子(或塔) vector ,并在我移动我的磁盘时更新它。所以对于 6 个钉子和 n 个磁盘的情况,我有一个源、一个目标和 4 个空闲钉子。这个想法是将 (n - p) where p ~ n/2 从源移动到 free_peg[3](第四个自由 Hook )。现在我的 vector 中只有 3 个空闲钉,我使用这 3 个空闲钉将 (n - p - 1) 个磁盘移动到 free_peg[2],然后我将最后一个磁盘从源移动到目标。所以现在我有 2 个免费 Hook 和 1 个源 = 3 个免费 Hook 。接下来,我需要使用 3 个空闲的 Hook (包括现在免费的源)将 (n - p - 1) 个磁盘从 peg[2] 移动到目的地。最后,使用 4 个空闲钉将 p 个磁盘从 free_peg[3] 移动到目的地。但是,当我在我的代码中实现它时,我遇到了段错误,有人可以帮我解决这个问题吗?

最佳答案

我能够解决 k-peg 通用解决方案,感谢您的帮助。以下是该算法的运行方式:

void move(int number_of_disks, int source, int dest, vector <int> free_peg)
{
int p, middle, g;

if (1 == number_of_disks)
{
moves++;
move_top_disk (source, dest);
}

else
{
moves++;

if(free_peg.size() >= 2)
p = number_of_disks/2;
else
p = number_of_disks - 1;

//Move top "p" disks from peg 1 to peg i
middle = free_peg.back();
free_peg.pop_back();
free_peg.push_back(dest);
move(p, source, middle,free_peg);

//Move "n - p " disks from peg 1 to another peg
free_peg.pop_back();
move(number_of_disks - p, source, dest, free_peg);

//Move p from current peg to the final peg
free_peg.push_back(source);
move(p, middle, dest, free_peg);
}
}

关于c++ - 汉诺塔 [编辑] - k peg 解决方案,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12545231/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com