糖和抖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>
#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 cal_step(int n)
{
if(n>1)
{
return 3*cal_step(n-1)+2;
}
else
return 2;
}
int main()
{
int n = 0;
while(scanf("%d\n",&n)!=EOF)
{
int ret = cal_step(n);
printf("%d\n",ret);
}
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>
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);
}
}