我遇到了河内塔的问题。我知道如何建造正常的河内塔,这很简单:
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座塔楼:
在第一张照片中,我们有正常的河内塔,第二张照片是我想制作的。现在我想要一根棍子(?)只有一个圆圈而另一根只有一个奇怪的圆圈。
你能帮帮我吗?
答案 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。