《C语言》汉诺塔

《C语言》汉诺塔

Main.c

#include "Hanoi.h"
//石柱的高度
#define HEIGHT 5
//盘子的个数
#define COUNT 5

void main()
{

	unsigned char** PP_Hanoi = CreateHanoi(HEIGHT, COUNT);
	HANOI(PP_Hanoi, HEIGHT, COUNT);

	system("pause");
}

Hanoi.h

#pragma once



#ifdef __cplusplus
extern "C"
{
#endif

#include <stdio.h>
#include <stdlib.h>
#include <memory.h>

#define HANOI(PP_Hanoi, HEIGHT, COUNT) Hanoi(PP_Hanoi, HEIGHT, COUNT,'A', 'B', 'C')

	//显示
	void Show(unsigned char** PP_Array, unsigned char Height);
	//移动盘子
	void Move(unsigned char** PP_Array, unsigned char Height, char X, char Y);
	//递归调用
	void Hanoi(unsigned char** PP_Array, unsigned char Height, unsigned char Count, char A, char B, char C);
	//创建汉诺塔
	unsigned char** CreateHanoi(unsigned char Height, unsigned char Count);

#ifdef __cplusplus
}
#endif

Hanoi.c

#include "Hanoi.h"



void Show(unsigned char** PP_Array, unsigned char Height)
{
	if (NULL!= PP_Array &&NULL!=*PP_Array)
	{
		printf("%5c%5c%5c\n--------------------\n", 'A', 'B', 'C');
		for (unsigned char i = 0; i < Height; i++)
		{
			for (unsigned char j = 0; j < 3; j++)
			{
				printf("%5d", PP_Array[i][j]);
			}
			puts("");
		}
		puts("");
	}
}

void Move(unsigned char** PP_Array,unsigned char Height,char X, char Y)
{
	unsigned char m = X - 65;
	unsigned char n = Y - 65;

	//保存第一个不为 0 的数据
	unsigned char Xmove = 0;
	for (unsigned char i = 0; i < Height; i++)
	{
		if (0 != PP_Array[i][m])
		{
			Xmove = i;
			break;
		}
	}

	//找到第一个为 0 的数据
	unsigned char Ymove = 0;
	if (0 == PP_Array[Height - 1][n])
	{
		Ymove = Height - 1;
	}
	else
	{
		for (unsigned char i = 0; i < Height; i++)
		{
			if (0!=PP_Array[i][n])
			{
				Ymove = i;
				break;
			}
		}
		Ymove -= 1;
	}

	//交换
	unsigned char Temp = PP_Array[Xmove][m];
	PP_Array[Xmove][m] = PP_Array[Ymove][n];
	PP_Array[Ymove][n] = Temp;
}

void Hanoi(unsigned char** PP_Array, unsigned char Height,unsigned char Count, char A, char B, char C)
{
	if (1 > Count)
	{
		return;
	}
	else if(1== Count)
	{
		printf("%c--->%c\n", A, C);
		Move(PP_Array, Height, A, C);
		Show(PP_Array, Height);
	}
	else
	{
		Hanoi(PP_Array, Height, Count - 1, A, C, B);
		printf("%c--->%c\n", A, C);
		Move(PP_Array, Height, A, C);
		Show(PP_Array, Height);

		Hanoi(PP_Array, Height ,Count - 1, B, A, C);
	}

}

unsigned char** CreateHanoi(unsigned char Height, unsigned char Count)
{
	if (Height > 1&&Height>= Count)
	{
		unsigned char** PP_Array = (unsigned char**)malloc(sizeof(unsigned char*)*Height);
		memset(PP_Array, 0, sizeof(unsigned char*)*Height);
		for (unsigned char i = 0; i < Height; i++)
		{
			PP_Array[i] = (unsigned char*)malloc(sizeof(unsigned char)*3);
			memset(PP_Array[i], 0, sizeof(unsigned char) * 3);
		}

		for (unsigned char i = 0; i < Count; i++)
		{
			PP_Array[Height - 1 - i][0] = i + 1;
		}

		return PP_Array;
	}
	return NULL;
}

View

A--->C
    A    B    C
--------------------
    0    0    0
    4    0    0
    3    0    0
    2    0    0
    1    0    5
    
A--->B
    A    B    C
--------------------
    0    0    0
    0    0    0
    3    0    0
    2    0    0
    1    4    5

C--->B
    A    B    C
--------------------
    0    0    0
    0    0    0
    3    0    0
    2    5    0
    1    4    0

A--->C
    A    B    C
--------------------
    0    0    0
    0    0    0
    0    0    0
    2    5    0
    1    4    3

B--->A
    A    B    C
--------------------
    0    0    0
    0    0    0
    5    0    0
    2    0    0
    1    4    3

B--->C
    A    B    C
--------------------
    0    0    0
    0    0    0
    5    0    0
    2    0    4
    1    0    3

A--->C
    A    B    C
--------------------
    0    0    0
    0    0    0
    0    0    5
    2    0    4
    1    0    3

A--->B
    A    B    C
--------------------
    0    0    0
    0    0    0
    0    0    5
    0    0    4
    1    2    3

C--->B
    A    B    C
--------------------
    0    0    0
    0    0    0
    0    0    0
    0    5    4
    1    2    3

C--->A
    A    B    C
--------------------
    0    0    0
    0    0    0
    0    0    0
    4    5    0
    1    2    3

B--->A
    A    B    C
--------------------
    0    0    0
    0    0    0
    5    0    0
    4    0    0
    1    2    3

C--->B
    A    B    C
--------------------
    0    0    0
    0    0    0
    5    0    0
    4    3    0
    1    2    0

A--->C
    A    B    C
--------------------
    0    0    0
    0    0    0
    0    0    0
    4    3    0
    1    2    5

A--->B
    A    B    C
--------------------
    0    0    0
    0    0    0
    0    4    0
    0    3    0
    1    2    5

C--->B
    A    B    C
--------------------
    0    0    0
    0    5    0
    0    4    0
    0    3    0
    1    2    0

A--->C
    A    B    C
--------------------
    0    0    0
    0    5    0
    0    4    0
    0    3    0
    0    2    1

B--->A
    A    B    C
--------------------
    0    0    0
    0    0    0
    0    4    0
    0    3    0
    5    2    1

B--->C
    A    B    C
--------------------
    0    0    0
    0    0    0
    0    0    0
    0    3    4
    5    2    1

A--->C
    A    B    C
--------------------
    0    0    0
    0    0    0
    0    0    5
    0    3    4
    0    2    1

B--->A
    A    B    C
--------------------
    0    0    0
    0    0    0
    0    0    5
    0    0    4
    3    2    1

C--->B
    A    B    C
--------------------
    0    0    0
    0    0    0
    0    0    0
    0    5    4
    3    2    1

C--->A
    A    B    C
--------------------
    0    0    0
    0    0    0
    0    0    0
    4    5    0
    3    2    1

B--->A
    A    B    C
--------------------
    0    0    0
    0    0    0
    5    0    0
    4    0    0
    3    2    1

B--->C
    A    B    C
--------------------
    0    0    0
    0    0    0
    5    0    0
    4    0    2
    3    0    1

A--->C
    A    B    C
--------------------
    0    0    0
    0    0    0
    0    0    5
    4    0    2
    3    0    1

A--->B
    A    B    C
--------------------
    0    0    0
    0    0    0
    0    0    5
    0    0    2
    3    4    1

C--->B
    A    B    C
--------------------
    0    0    0
    0    0    0
    0    0    0
    0    5    2
    3    4    1

A--->C
    A    B    C
--------------------
    0    0    0
    0    0    0
    0    0    3
    0    5    2
    0    4    1

B--->A
    A    B    C
--------------------
    0    0    0
    0    0    0
    0    0    3
    0    0    2
    5    4    1

B--->C
    A    B    C
--------------------
    0    0    0
    0    0    4
    0    0    3
    0    0    2
    5    0    1

A--->C
    A    B    C
--------------------
    0    0    5
    0    0    4
    0    0    3
    0    0    2
    0    0    1

猜你喜欢

转载自blog.csdn.net/baidu_41905806/article/details/85274056
今日推荐