汉诺塔问题源代码详解,一种比较形象的输出显示结果

// Hanoi.cpp : Defines the entry point for the console application.
//

#include <stdafx.h>
#include "stdio.h"
#include "iostream.h"
char c1[10][19],c2[10][19],c3[10][19];//存放状态,真实模拟三个塔座。
int MAX=0;
int number=3;//3阶汉诺塔
void draw()//输出三个塔座的信息
{
	char c;
	cout<<"按键后回车进行下一步"<<endl;
	cin>>c;//输入任意字符,此处的作用是用来手动控制移动,输入一个字符,移动一次。
	int j=0;
	int i=0;
	for(;i<=9; i++)
	{
		for(j=0; j<19; j++)
		{
			printf("%c",c1[i][j]);
		}
		printf("%s","      ");
		for(j=0; j<19; j++)
		{
			printf("%c",c2[i][j]);
		}
		printf("%s","      ");
		for(j=0; j<19; j++)
		{
			printf("%c",c3[i][j]);
		}
		printf("\n");
	}
	printf("-------------------      -------------------      -------------------\n\n");
}
void move(char x[10][19],char y[10][19])//把x塔座最上面一个移动到y塔座的最上面
{
	MAX++;//控制移动次数加1
	int first=0;
	int second=0;
	for(int i=0;i<10;i++)//从上到下来找
	{
		if(x[i][8]=='*')//x塔座出现第一行的位置
		{
			first=i;
			break;
		}
	}
	for(i=9;i>=0;i--)//从下向上来找
	{
		if(y[i][8]!='*')//y塔座第一行上面的位置
		{
			second=i;
			break;
		}
	}
	for(i=0;i<19;i++)
	{
		y[second][i]=x[first][i];//移动,将x塔座最上面一层移动到y塔座最上面
		if(i==9)//给x塔座的i层清空。
			x[first][i]='|';
		else
			x[first][i]=' ';
	}
	draw();
}

void hanoi(int n,char one[10][19],char two[10][19],char three[10][19])//汉诺塔原理,递归实现
{//将one塔座上的移动到three塔座上,第一步是将one塔座上的n-1个移动到two塔座,第二步将one塔座上的第n个移动到three塔座上,
	//第三步将two塔座上的n-1个移动到three塔座上。
	if(n==1)
		move(one,three);
	else
	{
		hanoi(n-1,one, three, two);
		move(one,three);
		hanoi(n-1,two,one,three);
	}
}
void main()
{
	int j=0;
	int i=0;
	for(;i<10;i++)
	{
		for(j=0;j<19;j++)
		{
			if(j==9)
			{
				c1[i][j]='|';
				c2[i][j]='|';
				c3[i][j]='|';
			}
			else
			{
				if( i >= 10-number)//共有number阶
				{
					int i1=i+number-10+1;
					if(j>=9-i1&&j<=9+i1)
						c1[i][j]='*';
					else
						c1[i][j]=' ';
				}
				else
				{
					c1[i][j]=' ';
					c2[i][j]=' ';
					c3[i][j]=' ';
				}
			}
		}
	}
	draw();
	hanoi(number,c1,c2,c3);
	printf("一共进行次数为:%d\n",MAX);
}


 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值