【算法分析】
九连环游戏的历史非常悠久,据说起源于战国时期。
九连环由九个相互连接的环组成,这九个环套在一个中空的长形柄中。
九连环的玩法是要将这九个环从柄上解下来。解下所有九个环需要解341步,因此人们需要有耐心。
对于给定的n连环,需要的步数为:
九连环的游戏规则:
(1)第 1 环可以自由上下;
(2)而上/下第 n 环时(n>1),则必须满足:(a)第 n-1 个环在架上;(b)前 n-2 个环全部在架下。
对于给定的n,拆解完n连环的步数如下表所示:
n | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 |
步数 | 1 | 2 | 5 | 10 | 21 | 42 | 85 | 170 | 341 | 682 | 1365 |
下面代码可用于解决n连环问题。
【C语言代码】
特别提醒:
下面自定义的函数 void up(int n); 表示上n个环,而不是上第n个环。
与此类似,自定义的函数 void down(int n); 表示下n个环,而不是下第n个环。
#include <stdio.h>
#include <string.h>
int step;
void up(int n); //上n个环
void down(int n); //下n个环
void down(int n) {
if(n==1)
printf("%d:1 DOWN\n",++step);
else if(n<=0) return;
else {
down(n-2);
printf("%d:%d DOWN\n",++step,n);
up(n-2);
down(n-1);
}
}
void up(int n) {
if(n==1)
printf("%d:1 UP\n",++step);
else if(n<=0) return ;
else {
up(n-1);
down(n-2);
printf("%d:%d UP\n",++step,n);
up(n-2);
}
}
int main() {
int n;
scanf("%d",&n);
printf("UP's step:\n");
step=0;
up(n);
printf("DOWN's step:\n");
step=0;
down(n);
printf("END\n");
return 0;
}
/*
3
UP's step:
1:1 UP
2:2 UP
3:1 DOWN
4:3 UP
5:1 UP
DOWN's step:
1:1 DOWN
2:3 DOWN
3:1 UP
4:2 DOWN
5:1 DOWN
END
*/
【C++代码】
特别提醒:
下面自定义的函数 void up(int n); 表示上n个环,而不是上第n个环。
与此类似,自定义的函数 void down(int n); 表示下n个环,而不是下第n个环。
#include <bits/stdc++.h>
using namespace std;
int step;
void up(int n); //上n个环
void down(int n); //下n个环
void down(int n) {
if(n==1)
printf("step%d:1 DOWN\n",++step);
else if(n<=0) return;
else {
down(n-2);
printf("step%d:%d DOWN\n",++step,n);
up(n-2);
down(n-1);
}
}
void up(int n) {
if(n==1)
printf("step%d:1 UP\n",++step);
else if(n<=0) return ;
else {
up(n-1);
down(n-2);
printf("step%d:%d UP\n",++step,n);
up(n-2);
}
}
int main() {
int n;
scanf("%d",&n);
printf("UP's step:\n");
step=0;
up(n);
printf("DOWN's step:\n");
step=0;
down(n);
printf("END\n");
return 0;
}
/*
3
UP's step:
step1:1 UP
step2:2 UP
step3:1 DOWN
step4:3 UP
step5:1 UP
DOWN's step:
step1:1 DOWN
step2:3 DOWN
step3:1 UP
step4:2 DOWN
step5:1 DOWN
END
*/
【参考文献】
https://blog.csdn.net/weixin_44040169/article/details/104384355
https://blog.csdn.net/weixin_43418664/article/details/83904826
https://blog.csdn.net/laoyang360/article/details/7857911
https://zhuanlan.zhihu.com/p/79226500
https://www.sohu.com/a/150145539_372450
https://haokan.baidu.com/v?pd=wisenatural&vid=13884581494855320361
https://blog.csdn.net/Catherinezxc/article/details/111938266