首页 > 技术文章 > [noip模拟]计蒜姬<BFS>

Danzel-Aria233 2017-09-18 21:19 原文

Description

兔纸们有一个计蒜姬,奇怪的是,这个计蒜姬只有一个寄存器X。兔纸们每次可以把寄存器
中的数字取出,进行如下四种运算的一种后,将结果放回寄存器中。
1.X=X+X
2.X=X-X
3.X=X*X
4.X=X/X
已知初始时寄存器里的值为A,兔纸们想要知道,是否能通过若干次操作,使得最终寄存器
里的值是B。如果可能,它们还想知道最少的操作次数。

Input

包含两个正整数A,B。

1 ≤ A,B ≤ 1000000000

Output

一个整数,即最少操作次数,如果不存在方案,则输出-1。

Sample Input

3 4

Sample Output

3
//
第一次:3/3=1
第二次:1+1=2
第三次:2*2=4



------------------------------------------------------分割线-----------------------------------------
最近有一种一巴掌拍死自己的冲动,我刚刚开始看到这道题,心想简单呗,就是一个BFS呗,最多加一点优化呗,于是两天过去了。。。。在我濒临崩溃之际,他终于过了

这道题虽然很简单,但是还是很有意思的,比较考思维,吃一蛰长一智,我很感谢自己把这道题坚持下来了
我一开始用的是很普通的BFS,一开始是超时,接着我把b为2的次方的情况给优化成O(1)的复杂度,但是还是要超时,百般无奈下,我看了题解
不得不说,很机智,反向BFS。。。。。。。
因为正向来的,a一不小心就会大于b,然后无限延伸下去,而反向来的话,当b到1就是极限了,所以总体来说的话缩小比加倍更加的优化
当我一个全新的程序出来以后,我还是一直WA,后来用Pascal程序提交算是过了,后来检查C++程序才终于发现,原来我忘了考虑a,b相等的情况

思路:反向缩小b,如果当
前值等于a就输出步数,值为1就输出步数+1,如果开平方和除以2都不能得到整数1就输出-1

我就提供一个反向BFS程序,正向的等我再去研究研究hash判重再说
 1 #include<cstdio>
 2 #include<cstring>
 3 #include<algorithm>
 4 #include<queue>
 5 #include<iostream>
 6 #include<cstdlib>
 7 #include<cmath>
 8 #define maxn 500000000
 9 using namespace std;
10 
11 int a,b;
12 struct node{
13     int val,dep;
14 };
15 queue<node>q;
16 
17 int check(node x)
18 {
19     if(x.val==a)return x.dep;
20     if(x.val==1)return x.dep+1;
21     return 0;
22 }
23 
24 int main()
25 {
26     scanf("%d%d",&a,&b);
27     if(a==b)
28     {
29         printf("0");return 0;
30     }
31     q.push((node){b,0});
32     while(!q.empty())
33     {
34         node x=q.front();
35         q.pop();
36         if(x.val%2==0)q.push((node){x.val/2,x.dep+1});
37         int nxt=floor(sqrt(x.val*1.0));
38         if(pow(nxt,2)==x.val&&nxt!=1)q.push((node){nxt,x.dep+1});
39         if(check(x)!=0){
40             printf("%d",check(x));return 0;
41         }
42         
43     }
44     printf("-1");
45 }
View Code

 




推荐阅读