程序设计C语言-递归(汉诺塔)

#include <stdio.h>
#include <stdlib.h>
/*汉诺塔经典问题,递归操作,适用于100阶以内的汉诺塔问题*/
int ary1[100], ary2[100], ary3[100]; //定义全局变量
int N;//定义阶数
int times;//定义计数器

int main() {
	void print_hanoi(void);
	printf("几阶汉诺塔: ");
	scanf_s("%d", &N, 1);
	times = 0;//计数器置零
	for (int i = 1;i <= N;i++) {//汉诺塔A塔赋值
		ary1[i] = i;
		ary2[i] = 0;
		ary3[i] = 0;
	}
	void move(int n, int x[100], int y[100], int z[100]);//声明移动函数
	/*输出未移动的汉诺塔*/
	print_hanoi();
	printf("\n     已移动\t%d\t次\t\t按Enter键继续下一步", times);
	if (getchar() == '\n');
	/*输出移动一次的汉诺塔,ps:不知道为啥,没办法在move函数里实现,估计是键入几阶的‘\n’被识别为下一步的标记了*/
	print_hanoi();
	printf("\n     已移动\t%d\t次\t\t按Enter键继续下一步", times);
	if (getchar() == '\n');

	move(N,ary1,ary2,ary3);//调用移动函数
	print_hanoi();
	printf("\n已完成移动,共移动\t%d\t次\t\t按Enter键退出", times);
	if (getchar() == '\n');

	return 0;
}
void move(int n, int x[100], int y[100], int z[100]) {
	if (n > 1) {
		move(n - 1, x, z, y);
		z[n] = x[n];
		x[n] = 0;
		times += 1;//操作一次,计数器加一
		print_hanoi();
		printf("\n     已移动\t%d\t次\t\t按Enter键继续下一步", times);
		if (getchar() == '\n');
		move(n - 1, y, x, z);
	}
	else {
		z[1] = x[1];
		x[1] = 0;
		times += 1;//操作一次,计数器加一
		print_hanoi();
		printf("\n     已移动\t%d\t次\t\t按Enter键继续下一步", times);
		if (getchar() == '\n');
	}
}

void print_hanoi(void) {
	system("CLS");
	for (int i = 1;i <= N;i++) {
		printf("\t");
		if (ary1[i] != 0)printf("%d ", ary1[i]);
		printf("\t");
		if (ary2[i] != 0)printf("%d ", ary2[i]);
		printf("\t");
		if (ary3[i] != 0)printf("%d ", ary3[i]);
		printf("\n");
	}
	printf("==================================");
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值