糖和抖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> 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; }
#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> #include<math.h> int cheik(int i) { if(i==1) return 2; else return 6*pow(3,i-2)+cheik(i-1); } int main() { int n=0; int count=0; int M=0; while(scanf("%d",&n)!=EOF){ M=cheik(n); printf("%d\n",M); } }
#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; }
public class Program { //步数 static int count = 0; //具体移动过程,这里为了更好理解定义了a,b,c三个参代表三个柱子,不用也行 public static void Move(int n, char a, char b, char c) { //当每一步都没有盘子时,进入下一步 if (n == 0) return; //第一步,把n-1个盘子从a移到c Move(n - 1, a, b, c); //第二步,把最大的盘子从a移到b count++; //第三步,把n-1个盘子从c移到a Move(n - 1, c, b, a); //第四步,把最大的盘子从b移到c count++; //第五步,把n-1个盘子从a移到c Move(n - 1, a, b, c); } public static void Main() { /* 1.思路抄评论区老哥的 2.给定n个盘子,移动过程分五步 一:把n-1个盘子从a移到c, 二:把最大的盘子从a移到b 三:把n-1个盘子从c移回a 四:把最大的盘子从b移到c 五:把n-1个盘子从a移到c 如此循环,当每一步都没有盘子移动时就进入下一步 */ string[] n = System.Console.ReadLine().Split(" "); for (int i = 0; i < n.Length; i++) { count = 0; //把给定的n转为int int num = int.Parse(n[i]); Move(num, 'a', 'b', 'c'); System.Console.WriteLine(count); } } }
import java.util.Scanner; public class Main{ public static void main(String[] args){ Scanner in = new Scanner(System.in); while(in.hasNextLine()){ int n=Integer.parseInt(in.nextLine()); int c=1,t=0; int step=0; for(int i=1;i<n;i++){ c=3*c+1; } step=2*c; if(n==1)System.out.println("2"); else System.out.println(step); } } }
import java.util.*; public class Main { //移动次数 //汉诺塔问题 public static int moveCount = 0; public static void main(String[] args){ Scanner scanner = new Scanner(System.in); //必须要加while(scanner.hasNext()),因为会输入很多数,有点小坑 while(scanner.hasNext()){ int n = scanner.nextInt(); Hanoi(n,'a','b','c'); System.out.println(moveCount); moveCount = 0; } } public static void Hanoi(int n,char a,char b,char c){ /*if(n == 1){ moveCount = 1; }*/ if(n == 0){ return; } Hanoi(n - 1,a,b,c); moveCount++; Hanoi(n - 1,c,b,a); moveCount++; Hanoi(n - 1,a,b,c); } }