zoukankan      html  css  js  c++  java
  • [noip模拟]计蒜姬<BFS>

    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



  • 相关阅读:
    CSS定位属性position相关介绍
    JavaScript 预解析机制
    使用 python 实现π的计算
    turtle库的学习
    关于使用MVVM模式在WPF的DataGrid控件中实现ComboBox编辑列
    关于wpf窗体中Allowtransparent和WindowsFormsHost的纠纷
    关于WPF中ItemsControl系列控件中Item不能继承父级的DataContext的解决办法
    Python简史
    敏捷开发原则
    线程池
  • 原文地址:https://www.cnblogs.com/Danzel-Aria233/p/7545296.html
Copyright © 2011-2022 走看看