首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >河内塔[编辑]-k peg解决方案

河内塔[编辑]-k peg解决方案
EN

Stack Overflow用户
提问于 2012-09-22 23:45:14
回答 1查看 3.7K关注 0票数 0

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

代码语言:javascript
运行
复制
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);
    }

这个想法很简单,我保留了一个空闲的钉子(或塔)的向量,当我移动我的磁盘时,我会更新它。因此,对于6个pegs和n个磁盘的情况,我有一个源,一个目的地和4个空闲pegs。其思想是将(n - p)处的p~ n/2从源移动到free_peg3。现在我的向量中只有3个空闲的peg,我使用这3个空闲的peg将(n -p- 1)个磁盘移动到free_peg2,然后将最后一个磁盘从源磁盘移动到目标磁盘。所以现在我有2个空闲的pegs和1个source =3个空闲的pegs。接下来,我需要使用3个空闲的peg(包括现在空闲的源)将(n -p- 1)个磁盘从peg2移动到目的地。最后,使用4个空闲的peg将p个磁盘从free_peg3移动到目的地。然而,当我在我的代码中实现这一点时,我得到了一个分段错误,有人能帮我解决这个问题吗?

EN

回答 1

Stack Overflow用户

发布于 2012-09-23 06:02:18

我能够解决一个k-peg通用解决方案,谢谢你的帮助。下面是算法的运行方式:

代码语言:javascript
运行
复制
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);
        }
    }
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12545231

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档