糖和抖m在玩个游戏,规定谁输了就要请谁吃顿大餐:抖m给糖a b c三个驻, 并在a柱上放置了数量为n的圆盘,圆盘的大小从上到下依次增大,现在要做的事就是把a柱的圆盘全部移到c柱,移动的过程中保持小盘在上,大盘在下,且限定圆盘只能够移动到相邻的柱子,即a柱子上的圆盘只能够移动到b,b柱子上的圆盘只能够移动到a或者c,c同理。现在请你设计一个程序,计算所需移动的最小步数, 帮助糖赢得大餐!
糖和抖m在玩个游戏,规定谁输了就要请谁吃顿大餐:抖m给糖a b c三个驻, 并在a柱上放置了数量为n的圆盘,圆盘的大小从上到下依次增大,现在要做的事就是把a柱的圆盘全部移到c柱,移动的过程中保持小盘在上,大盘在下,且限定圆盘只能够移动到相邻的柱子,即a柱子上的圆盘只能够移动到b,b柱子上的圆盘只能够移动到a或者c,c同理。现在请你设计一个程序,计算所需移动的最小步数, 帮助糖赢得大餐!
每一行输出有一个整数n(0<=n<26), 直至文件末尾。
对于每一组数据,输出一行,输出移动的最小步数M。
1
2
#include <stdio.h> //假设共有n个盘子,首先我需要将(n-1)个小盘子从A移动到C上,假设需要f(n-1)步。 //1、将上面的n-1个盘子移动到C——f(n-1)步 //2、将最后的大盘子移动到B——1步 //3、将n-1个盘子再移动回A柱——f(n-1)步 //4、将大盘子移动到C柱——1步 //5、将n-1个盘子移动到C柱——f(n-1)步 //共3*f(n-1)+2步 int step(int n) { if(n>1) return 3*step(n-1)+2; else return 2; } int main() { int n=0; while(scanf("%d",&n)!=EOF) { int m=step(n); printf("%d\n",m); } return 0; }
#include<stdio.h> int count=0; void digui(int n,char a,char b,char c) { if(n==0) return ; //将n-1个盘子借助B移动到c上, digui(n-1,a,b,c); //将最大的一个移动到B上 count++; //将C上的n-1个借助B,移动到A上// digui(n-1,c,b,a); //将B的最大一个移动到C上 count++; //最后再将A上的n-1个移动到C上 digui(n-1,a,b,c); } int main() { int n=0; while(scanf("%d",&n)!=EOF) { count=0; digui(n,'a','b','c'); printf("%d\n",count); } return 0; }
#include <stdio.h> int count; void Honoi(int n, char a, char b, char c){ if(n == 0) return ; Honoi(n-1, a, b, c); // A(n-1) -> C count++; // A -> B Honoi(n-1, c, b, a); // C(n-1) -> A count++; // B -> C Honoi(n-1, a, b, c); // n-1层问题 } int main(){ int n; while(~scanf("%d", &n)){ count = 0; Honoi(n, 'a', 'b', 'c'); printf("%d\n", count); } return 0; }