题解 | 大吉大利,今晚吃鸡
大吉大利,今晚吃鸡
https://www.nowcoder.com/practice/c9d9f9c60b4448eabc0569f80a3461bb
#include <stdio.h>
//常规的汉诺塔,位置不重要,两道题都可以画图推一下
// int Hanoi(int n){
// if(n==1){
// return 1;
// }else {
// return 2*Hanoi(n-1)+1;
// }
// }
//移动限制导致大盘子和集合的移动次数都增加了
int Hanoi_Neibor(int n){
if(n==1){
return 2;
}else{
return 3*Hanoi_Neibor(n-1)+2;
}
}
int main() {
int n,count=0;
while(scanf("%d",&n)!=EOF){
//汉诺塔f(n)=2*f(n-1)+1递推可知 总的移动次数可以分解为两次小集合的移动f(n-1)+新增盘子的移动1
//X 0 0 -> X- 0 x == X x 0 -> X- x new -> X- 0 x+
// count=Hanoi(n);
//但本题是汉诺塔的变体!!!只能移动到相邻位置
//X 0 x != X x 0
//把集合的移动看作整体,前一次集合的状态一定是X 0 x (+f(n-1))-> X- 1 x (+1)-> X-/x 1 0 (+f(n-1))
//-> X-/x 0 1 (+1) -> X- 0 x+ (+f(n-1))
//整理可得f(n)=3*f(n-1)+2
count=Hanoi_Neibor(n);
printf("%d\n",count);
}
return 0;
}



查看7道真题和解析