【问题标题】:Solving Hanoi puzzle using recursion使用递归解决河内难题
【发布时间】:2017-08-02 02:40:57
【问题描述】:

我目前正在创建一个程序,显示解决河内难题的每一步。我需要显示每个圆盘的位置,从开始位置开始的每一步都显示为(A,A,A)。 A = 第一个挂钩,B = 第二个挂钩,C = 第三个挂钩。我有输出动作但不输出位置的程序。我如何将职位落实到计划中?到目前为止,这是我的代码以及我的输出和一个图表,显示了每次移动后的位置。盘数是 const 3。

#include <iostream>
using namespace std;

void moveDiscs(int num,int fromPeg,int toPeg, int tempPeg){;
char position;
    if(num > 0){
        moveDiscs(num-1,fromPeg,tempPeg,toPeg);
        cout << "Move a disc from peg "<<fromPeg<<" to peg "<<toPeg<<endl;
        moveDiscs(num-1,tempPeg,toPeg,fromPeg);
    }
}
int main() {
    const int from_peg = 1;
    const int to_peg = 3;
    const int temp_peg = 2;

    moveDiscs(3,from_peg,to_peg,temp_peg);
    return 0;
}

【问题讨论】:

  • 我怀疑这可以在没有对您的代码进行重大添加的情况下完成。递归解决方案是在解决方案的每个级别上,函数都认为自己正在解决一个完整的问题。因此,递归调用所代表的子问题无法了解整体问题,也无法按照您描述的方式跟踪光盘。
  • 请看我的解决方案

标签: c++ computer-science


【解决方案1】:

以下是跟踪每个移动和每个钉位置的解决方案 我正在使用 stl::map peg A 有 3,2,1 peg B , empty , peg C ,empty (必须移动的地方。

目前的解决方案是基于约束可以根据约束变化进行更新

#include <iostream>
#include <map>
#include <deque>
using namespace std;

map<int,deque<int>> bucket;
deque<int> A{3,2,1};
deque<int> B;
deque<int> C;



void moveDiscs(int num,int fromPeg,int toPeg, int tempPeg){;
    if(num > 0){
        moveDiscs(num-1,fromPeg,tempPeg,toPeg);
        cout << "Move a disc from peg "<<fromPeg<<" to peg "<<toPeg<<endl;
        auto val = bucket[fromPeg].front();
        bucket[fromPeg].pop_front();
        bucket[toPeg].push_front(val);
        for (auto it:bucket)
        {
            cout << it.first << "::";
            for (auto di = it.second.begin(); di != it.second.end(); di++)
            {
                cout << "=>" << *di;
            }
            cout << endl;
        }

        moveDiscs(num-1,tempPeg,toPeg,fromPeg);
    }
}
int main() {

    bucket[1] = A;
    bucket [2] =B;
    bucket[3] = C;
    const int from_peg = 1;
    const int to_peg = 3;
    const int temp_peg = 2;

    moveDiscs(3,from_peg,to_peg,temp_peg);
    return 0;
}

输出

Move a disc from peg 1 to peg 3
1::=>2=>1
2::
3::=>3
Move a disc from peg 1 to peg 2
1::=>1
2::=>2
3::=>3
Move a disc from peg 3 to peg 2
1::=>1
2::=>3=>2
3::
Move a disc from peg 1 to peg 3
1::
2::=>3=>2
3::=>1
Move a disc from peg 2 to peg 1
1::=>3
2::=>2
3::=>1
Move a disc from peg 2 to peg 3
1::=>3
2::
3::=>2=>1
Move a disc from peg 1 to peg 3
1::
2::
3::=>3=>2=>1
Program ended with exit code: 0

所以你可以看到从 Peg A (1::3=>2=>1) 移动到 peg C(3::3=>2=>1)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-09-27
    • 2016-05-25
    • 2016-01-27
    • 1970-01-01
    • 1970-01-01
    • 2015-10-08
    • 2013-08-31
    • 2018-12-18
    相关资源
    最近更新 更多