A. Transformation: from A to B(dfs)

A. Transformation: from A to B

题目描述
在这里插入图片描述
Example
input

2 162

output

YES
5
2 4 8 81 162 

input

4 42

output

NO

题意思路:给a和b,让通过两种操作从a得到b是否可能,若可能输出YES和几步,及每步得到的数,若不可能,输出NO。两种操作如下:
①2x
②10
x+1
采用dfs来解决,每次否有两种选择。dfs走两条路的同时还要记录每一步得到的数,需要在两种选择进行下一步dfs之间加上判断是否第一个选择已经可以满足,如果已经满足直接返回,不用再走第二个选择。每加这个的时候输出虽然是yes,但是数是两个选择的结果交替的数值过程,出现错误。
还有一个点就是,在用x*10的时候要判断会不会超范围
代码

#include <bits/stdc++.h>
using namespace std;
int res=0,flag=0;
int a,b,k;
int v[10000005];
void dfs(int x,int k)
{
    if(x==b)
    {
        flag=1;
        res=k;
        return;
    }
    if(x>b)
        return;
    v[k]=10*x+1;
    if(x<=2e8)
        dfs(x*10+1,k+1);
    if(flag)
        return;
    v[k]=2*x;
    dfs(x*2,k+1);
}
int main()
{
    scanf("%d%d",&a,&b);
    k=0;
    v[0]=a;
    dfs(a,1);
    if(flag==1)
    {
        printf("YES\n");
        printf("%d\n",res);
        for(int i=0; i<res; i++)
            printf("%d ",v[i]);
        printf("\n");
    }
    else
        printf("NO\n");
    return 0;
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值