1. 程式人生 > >九連環 C語言遞迴程式碼

九連環 C語言遞迴程式碼

兩年前玩九連環時候寫的,想清一下硬碟刪些東西。

實際上九連環的裝和卸都是遞迴操作:

1.第一個環可以自由裝/卸

2.第i(i>1&&i<10)個環需要第i-1個環的輔助才能完成裝/卸,且需要第1個到第i-2個環均處於已拆卸狀態。

假如現在想卸下第7個環,那麼需要保證第六個環處於未拆卸狀態,並且需要已經卸下了第1到第5個環,然後用第6個環卸下第7環。之後你會發現:咦TMD第6個怎麼沒卸下來。想卸下第6個又需要裝上第5個,再保證第1個到第4個環已拆卸。。。

C程式碼:

int shangmian[10];//環的狀態,1表示未拆卸
int step = 0;
void zhuang(int n);

void xie(int n) {
	if (n == 1) { printf("第%d步:卸掉--> %d\n", step++, n);shangmian[n] = 0; return; }
	if (shangmian[n - 1] == 0) { zhuang(n - 1); }
	for (int i = n - 2; i >= 1; i--) {
		if (shangmian[i] == 1) { xie(i); }
	}
	printf("第%d步:卸掉--> %d\n", step++, n); 
	shangmian[n] = 0;
	return;
}

void zhuang(int n) {
	if (n == 1) { printf("第%d步:裝上--> %d\n", step++, n);shangmian[n] = 1; return; }
	if (shangmian[n - 1] == 0) { zhuang(n - 1); }
	for (int i = n - 2; i >= 1; i--) {
		if (shangmian[i] == 1) { xie(i); }
	}

	printf("第%d步:裝上--> %d\n", step++, n);shangmian[n] = 1;
	return;
}

int   _tmain(int   argc, TCHAR  *argv[], TCHAR *env[]) {

	for (int i = 0; i < 10; i++) { shangmian[i] = 1; }
	for (int i = 9; i >= 1; i--) { xie(i); }
	//xie(8);

	system("pause");
	return 0;
}