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
②10x+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;
}