首页 > 试题广场 >

大吉大利,今晚吃鸡

[编程题]大吉大利,今晚吃鸡
  • 热度指数:3975 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 128M,其他语言256M
  • 算法知识视频讲解

糖和抖m在玩个游戏,规定谁输了就要请谁吃顿大餐:抖m给糖a b c三个驻, 并在a柱上放置了数量为n的圆盘,圆盘的大小从上到下依次增大,现在要做的事就是把a柱的圆盘全部移到c柱,移动的过程中保持小盘在上,大盘在下,且限定圆盘只能够移动到相邻的柱子,即a柱子上的圆盘只能够移动到b,b柱子上的圆盘只能够移动到a或者c,c同理。现在请你设计一个程序,计算所需移动的最小步数, 帮助糖赢得大餐!


输入描述:
每一行输出有一个整数n(0<=n<26), 直至文件末尾。


输出描述:
对于每一组数据,输出一行,输出移动的最小步数M。
示例1

输入

1

输出

2
#include <iostream>
using namespace std;

int main() {
    int n, res;
    while (cin >> n) {
        res = 0;
        for (int i = 1; i <= n; ++i) res = 3 * res + 2;
        cout << res << endl;        
    }
    return 0;
}

发表于 2022-04-01 21:20:20 回复(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;
}

发表于 2022-06-17 21:17:16 回复(0)
#include <iostream>
using namespace std;

int main()
{
    int n;
    while (~scanf("%d", &n))
    {
        int res = 0;
        for (int i = 1; i <= n; i ++ ) res = 3 * res + + 2;
        printf("%d\n", res);        
    }

}

发表于 2022-03-01 20:29:02 回复(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;
}

发表于 2024-10-06 17:39:36 回复(0)
#include <stdio.h>

int main()
{
	int n = 0;
	int i = 0;
	while (scanf("%d", &n)!=EOF)
	{
		int sum = 1;
		for (i = 1; i <= n; i++)
		{
			sum *= 3;
		}
		printf("%d\n", sum-1);
	}
	return 0;
}

发表于 2024-09-03 16:27:34 回复(0)
#include <iostream>
using namespace std;
#include <cmath>
int hanoi(int a)
{
    return pow(3 , a) - 1;
}
int main() 
{
    int a;
    while(cin >> a)
    {
        cout << hanoi(a) << endl;
    }
}

发表于 2024-05-16 08:41:36 回复(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);
    }
}

编辑于 2024-04-01 23:21:09 回复(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;
}

发表于 2024-02-01 17:29:06 回复(0)
package main

import (
    "fmt"
    "math"
)

func main() {
    var n int
    for {
        _,err := fmt.Scan(&n) 
        if err != nil {
            break
        }
        fmt.Println(math.Pow(float64(3), float64(n))-1)
    }
}
发表于 2023-12-23 01:58:48 回复(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);
        }
    }
}

发表于 2023-01-07 12:57:11 回复(0)
#include <stdio.h>
#include <math.h>
int main()
{
    int n;
    while (scanf("%d",&n)!=EOF)
    {
        int t=pow(3,n) ;
        printf("%d\n",t -1);
    }
    return 0;
}
发表于 2022-08-17 14:54:52 回复(0)
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);
        }
    }
}

发表于 2022-08-02 16:15:51 回复(0)
#include<stdio.h>
#include<math.h>


int cj(int n)
{
    int i=0;
    i=pow(3,n)-1;
    return i;

int main()
{
    int n;
    int m;
    while(scanf("%d",&n)!=EOF)
    {
    m=cj(n);
    printf("%d\n",m);
    }
   
}
发表于 2022-07-20 20:53:16 回复(0)
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);
        }
}

发表于 2022-07-06 15:17:38 回复(0)
问一下它限定每次移动的盘子数目了吗?
发表于 2022-06-22 21:47:58 回复(1)
#include<stdio.h>

int f(int n)
{
    if(n==1){return 2;}
    return 3*f(n-1)+2;
}

int main(void)
{
    int n;
    while(scanf("%d",&n)!=EOF)
    {
        printf("%d\n",f(n));
    }
}
发表于 2022-03-17 18:18:17 回复(0)