建造奇数甚至河内塔

时间:2015-05-06 16:30:22

标签: algorithm recursion

我遇到了河内塔的问题。我知道如何建造正常的河内塔,这很简单:

void solveTowers(char src, char dst, char mid, int n)
{
    if (n == 0)
    {
        return;
    }
    solveTowers(src, mid, dst, n - 1);
    cout << "Move " << ++counter << ": disk " << n << " from " << src << " to " << dst << endl;
    solveTowers(mid, dst, src, n - 1);
}

但现在我想建造2座塔楼:

enter image description here

在第一张照片中,我们有正常的河内塔,第二张照片是我想制作的。现在我想要一根棍子(?)只有一个圆圈而另一根只有一个奇怪的圆圈。

你能帮帮我吗?

2 个答案:

答案 0 :(得分:2)

正如我在评论中已提出的那样,您可以从外部函数多次调用solveTowers()。以下代码对我来说很好:

void solveTowers(int src, int dst, int mid, int n, vector<vector<int>>& pegs) {
    if (n == 0) {
        return;
    }
    solveTowers(src, mid, dst, n - 1, pegs);
    cout << "Moving disk " << n << " from " << src << " to " << dst << endl;
    int t = pegs[src].back();
    pegs[src].pop_back();
    pegs[dst].push_back(t);

    cout<<"pegs:\n";for(int r=0;r<pegs.size();++r){for(int c=0;c<pegs[r].size();++c)cout<<pegs[r][c]<<"\t";cout<<"\n\n";}cout<<endl;
    solveTowers(mid, dst, src, n - 1, pegs);
}

void solve_odd_even(int n) {
    vector<vector<int>> pegs(3);
    for (int i = 0; i < n; ++i) {
        pegs[0].push_back(n - i); 
    }   
    int dst = 1;
    int mid = 2;
    if (n % 2)
        swap(dst, mid);
    solveTowers(0, dst, mid, n, pegs);
    for (int h = n - 1; h > 0; --h) {
        int src = 1;
        int dst = 2;
        if (h % 2 == 0)
            swap(src, dst);
        solveTowers(src, dst, 0, h, pegs);
    }   
}

int main(int argc, char* argv[]) {
    solve_odd_even(atoi(argv[1]));
    return 0;
}

答案 1 :(得分:1)

这将是生成塔的解决方案:

1234    -     -  
234     -     1
34      2     1
34      12    -
4       12    3
4       2     13
24      -     13

一般来说,对于任何有效的起点和终点,可以通过Dijkstra算法解决hanoitower。