1. 程式人生 > >漢諾塔問題原始碼詳解,一種比較形象的輸出顯示結果

漢諾塔問題原始碼詳解,一種比較形象的輸出顯示結果

// 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);
}