魔法鲜花c++

问题 A: 魔法鲜花

 
时间限制: 1.000 Sec  内存限制: 128 MB
提交: 107  解决: 78
[命题人:][下载数据: ?]

题目描述

   小李手上有一束魔法鲜花,他想将这些花送给小媛,但是小媛只想要特定数量的花。好在这些魔法鲜花可以在小李的控制下变化数量,这样小李就可以刚好变出足够数量的鲜花,来送给小媛了。但是笨手笨脚的小李想要尽快变出刚好数量的鲜花,现在小李找到了你,想要你告诉他最快的变化方法。

已知小李的魔法鲜花的手柄上,有3个按钮。可以对鲜花的数量做出如下改变:

(1)按A按钮:鲜花数量+1

(2)按B按钮:鲜花数量-10(手里鲜花数量足够的情况下)

(3)按C按钮:鲜花数量*2

小李的魔法鲜花只能变出1到100000的朵鲜花。

输入

一行两个整数a,b表示小明手中的初始鲜花数量与目标鲜花数量。(1<=a,b<=1e5)

输出

第一行:一个整数,表示小明得到目标鲜花数量所需要的步数。

第一行:一个字符串表示按钮的操作序列,若方法不止一种,则输出步数最小,且操作序列字典序最小的那个。

样例

输入  
17 24
输出  
2
CB

提示

 这题其实和抓住那头牛差不多,就是还要输出操作序列。

代码

#include <bits/stdc++.h>
using namespace std;
struct node {
  int x,step;
  string czxl; 
};
queue <node> Q;
int newwz[4],newstep;
string newczxl[4];
bool vis[200001];
int s,t;

int main() {
  cin>>s>>t;
  if(s==t) { cout<<0<<endl; return 0;}
  
  Q.push({s,0,""});  vis[s]=1;  
  while(!Q.empty()) {
    //取头节点 
    int tx=Q.front().x;
    int tstep=Q.front().step;
    string tczxl=Q.front().czxl;
    Q.pop();
    
    //扩展3个节点 
    newstep=tstep+1;  
    newwz[1]=tx+1;  newczxl[1]=tczxl+"A";newwz[2]=tx-10;newczxl[2]=tczxl+"B";newwz[3]=2*tx;  newczxl[3]=tczxl+"C";    
      //{newwz[1],newstep,newczxl[1]}      //{newwz[2],newstep,newczxl[2]}     //{newwz[3],newstep,newczxl[3]}
    
    //处理三个节点 
    for(int i=1; i<=3; i++) {
      
      if(newwz[i]==t) //如果出现了目标鲜花数,则输出步数和步骤 ,程序结束 
      {
        cout<<newstep<<endl;cout<<newczxl[i]<<endl;  return 0;
      }
      
      //若没达到目标 
      int nxx=newwz[i];
      if(vis[nxx]==0&&nxx>=0&&nxx<=100000)//若数字没出现过,且在规定范围内,则入队,并标记出现过。 
      {
        Q.push({nxx,newstep,newczxl[i]});
        vis[nxx]=1;
      }
    }
  }
  cout<<"wujie"<<endl;
  return 0;
}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值