算法实验-双色汉诺塔

妖精的绣舞 提交于 2020-02-03 07:04:31

实验原理

与纯汉诺塔问题相同

实验步骤

经过奇偶异同分析可知。当出发柱子A为奇数个盘子 时;最上与最下层颜色为红色,过渡柱子C有偶数个盘子,且最 底层为蓝色:最上层位红色,目标B柱子最底层为红色.A柱子 最上层颜色为奇数一(奇数+偶数)=偶数一蓝色,过渡柱子C上 的偶数个盘子.移动时就变成出发柱子,A柱变成过渡柱子且 叠加的第一个盘子为红色,目标柱子叠加的是蓝色。以此类 推。不会出现同色叠加。 同理,当出发柱子A为偶数个盘子时,最上层为红色、最底 。层为蓝色,过度柱子C有奇数个盘子,且最上、最底层为红色,目 标B柱子最底层为蓝色。A柱子最上层颜色为偶数一(奇数+奇数) =偶数一蓝色.过渡柱子C上的奇数个盘子,移动时就变成出发 柱子.A柱变成过度柱子且叠加的第一个盘子为蓝色.目标柱子 叠加的是红色。以此类推.同样不会出现同色叠加的情况。

关键代码

void move(int a,int b){
	out<<"塔"<<a<<"到塔"<<b<<endl;
}
void hanoi(int n,int a,int b,int c){
	if(n>0){
		hanoi(n-1,a,c,b);
		out<<"将第"<<n<<"盘从";
		move(a,b);
		hanoi(n-1,c,b,a);
	}
}
int main()
{
	ifstream in;
	in.open("input004.txt");	
	out.open("output004.txt");
	int n;
	in>>n;
	hanoi(n,1,2,3);
	return 0;
}

完整代码

#include<iostream>
#include<fstream>
using namespace std;
ofstream out;
void move(int a,int b){
	out<<"塔"<<a<<"到塔"<<b<<endl;
}
void hanoi(int n,int a,int b,int c){
	if(n>0){
		hanoi(n-1,a,c,b);
		out<<"将第"<<n<<"盘从";
		move(a,b);
		hanoi(n-1,c,b,a);
	}
}
int main()
{
	ifstream in;
	in.open("input004.txt");	
	out.open("output004.txt");
	int n;
	in>>n;
	hanoi(n,1,2,3);
	return 0;
}
标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!