KTFinn 2023-04-19 20:11 采纳率: 45.5%
浏览 18

关于#蓝桥杯#的问题,如何解决?

Dqs1u. 汉诺塔问题(移动方向记数)
时间限制:1.0s   内存限制:256.0MB   代码提交间隔:3分钟(现在可以提交)  
试题来源:蓝桥杯2018国际赛 中文版 Lanqiao 第四题
问题描述
汉诺塔问题是一个经典的数学问题。

给定三根柱子A、B、C,柱子A上按大小顺序放着 n 个大小不同的盘子,最下面的盘子最大,最上面的盘子最小。现在要将所有盘子从柱子A移动到柱子C上,问最少要移动多少次。

答案是最少 2n−1 次。而且要以最少的次数完成移动,只存在一种方案。

比如,当 n=3 时,总共要移动 23−1=7 步:

第1步:最小的盘子从A移到C,记为A→C;

第2步:第2小的盘子从A移到B,记为A→B;

第3步:最小的盘子从C移到B,记为C→B;

第4步:第3小的盘子从A移到C,记为A→C;

第5步:最小的盘子从B移到A,记为B→A;

第6步:第2小的盘子从B移到C,记为B→C;

第7步:最小的盘子从A移到C,记为A→C。

请问,总共有多少次A→B,多少次A→C,多少次B→A,多少次B→C,多少次C→A,多少次C→B?

输入格式
输入的第一行包含一个整数 n。

输出格式
输出六行,每行一个整数。分别表示以上六个问题的答案。

样例输入  
3

样例输出  
1
3
1
1
0
1

评测用例规模与约定
对于30%的评测用例,1≤n≤10。

对于60%的评测用例,1≤n≤30。

对于所有评测用例,1≤n≤60。

img


#include<bits/stdc++.h>
using namespace std;
void tmp(int n,char a,char b,char c,int &ab,int &ac,int &ba,int &bc,int &ca,int &cb)
{
    if(n == 1)
    {
        if(a == 'A' && c == 'B') ab++;
        else if(a == 'A' && c == 'C') ac++;
        else if(a == 'B' && c == 'A') ba++;
        else if(a == 'B' && c == 'C') bc++;
        else if(a == 'C' && c == 'A') ca++;
        else if(a == 'C' && c == 'B') cb++;
        return ;
    }
    tmp(n - 1,a,c,b,ab,ac,ba,bc,ca,cb);
    if (a == 'A' && c == 'B') ab++;
    else if (a == 'A' && c == 'C') ac++;
    else if (a == 'B' && c == 'A') ba++;
    else if (a == 'B' && c == 'C') bc++;
    else if (a == 'C' && c == 'A') ca++;
    else if (a == 'C' && c == 'B') cb++;
    tmp(n - 1,b,a,c,ab,ac,ba,bc,ca,cb);
}
int main()
{
    int n;
    scanf("%d",&n);
    int ab = 0,ac = 0,ba = 0,bc = 0,ca = 0,cb = 0;
    tmp(n,'A','B','C',ab,ac,ba,bc,ca,cb);
    printf("%d\n%d\n%d\n%d\n%d\n%d",ab,ac,ba,bc,ca,cb);
    return 0;
}

帮帮我把

  • 写回答

2条回答 默认 最新

  • CSDN-Ada助手 CSDN-AI 官方账号 2023-04-19 22:10
    关注
    • 你可以看下这个问题的回答https://ask.csdn.net/questions/7640312
    • 除此之外, 这篇博客: 编写程序判断可逆素数,若将某一素数的各位数字的顺序颠倒后得到的数仍是素数,则此素数称为可逆素数。编写一个判断某数是否可逆素数的函数,在主函数中输入一个整数,再调用此函数进行判断。中的 编写程序判断可逆素数,若将某一素数的各位数字的顺序颠倒后得到的数仍是素数,则此素数称为可逆素数。编写一个判断某数是否可逆素数的函数,在主函数中输入一个整数,再调用此函数进行判断。 部分也许能够解决你的问题, 你可以仔细阅读以下内容或跳转源博客中阅读:
    • import java.util.Scanner;
      
      public class Test2_6_ztk {
          public static void main(String args[]){
              int num=1;
              int k=0;
              int f=0;
              int a[]=new int[100];
              Scanner in=new Scanner(System.in);
              int x=in.nextInt();
              if(isPrimeNum(x)==false)
              {
                  System.out.println("该数不是可逆素数");
                  System.exit(0);
              }
              else
              for(int i=0;;i++){
                  if(x!=0){
                      a[i]=x%10;
                      x=x/10;
                      num*=10;
                      k++;
                  }
                  else
                      break;
      
              }
              for(int i=0;i<k;i++){
                  f=f*10+a[i];
              }
              System.out.println("该数反转后是:"+f);
              if(isPrimeNum(f))
              {
                  System.out.println("该数是可逆素数");
              }
              else
                  System.out.println("该数不是可逆素数");
          }
      
          public static boolean isPrimeNum(int a){//判断是否是素数
              if(a<=1)
                  return false;
              for(int i=2 ; i<=Math.sqrt(a) ; i++){
                  if(a%i==0){
                      return false;
                  }
              }
              return true;
          }
      }
      
      

      Java中定义数组的方式:int a[]=new int[100] //a是数组的名字,int是数组中存的类型

      判断一个数是否是素数的办法:

       public static boolean isPrimeNum(int a){//判断是否是素数
              if(a<=1)
                  return false;
              for(int i=2 ; i<=Math.sqrt(a) ; i++){
                  if(a%i==0){
                      return false;
                  }
              }
              return true;
          }
      

      另外Java中的弹出提示框输入及输出

      String s= JOptionPane.showInputDialog(null,"请输入三位整数");//输入字符型的数据,如果使用可以进行转换
      JOptionPane.showMessageDialog(null,"交换后的正整数的值是:"+e);//输出
      
    评论

报告相同问题?

问题事件

  • 创建了问题 4月19日

悬赏问题

  • ¥15 部分客户订单定位有误的问题
  • ¥15 如何在maya程序中利用python编写领子和褶裥的模型的方法
  • ¥15 Linux权限管理相关操作(求解答)
  • ¥15 Bug traq 数据包 大概什么价
  • ¥15 在anaconda上pytorch和paddle paddle下载报错
  • ¥25 自动填写QQ腾讯文档收集表
  • ¥15 DbVisualizer Pro 12.0.7 sql commander光标错位 显示位置与实际不符
  • ¥15 android 打包报错
  • ¥15 关于stm32的问题
  • ¥15 ncode振动疲劳分析中,noisefloor如何影响PSD函数?