single or single (bfs入门题)


    妹子终于答应和BJ交往了,但有个前提,BJ必须进入一个有电梯的魔法大楼接受考验,假设大楼有无数层,BJ开始被关在第n层的电梯中,电梯每次有三种移动方式,上升一层,下降一层,从第i层直接上升到第2i层,每次移动都需要1分钟的时间,只有层数为素数的楼层电梯门才可以打开,门打开BJ就可以出来了,妹子只给了他k分钟,规定时间内BJ能出来则可以带走妹子过上幸福的生活,否则他就注孤了,单身已久的BJ当然是希望尽快出来。

输入


第一行包含一个整数T代表数据组数,每组数据有两个数字n和k

(1 <= T <= 50,1 <= n <= 1e7,0 <= k <= 20)

输出


如果BJ可以在规定时间内出来,则输出BJ gets the pretty meizi with x minutes! (x为BJ出电梯的最快时间),否则输出Poor BJ, single all his life!


样例输入
3
6 0
26 2
10 1


样例输出
Poor BJ, single all his life!
BJ gets the pretty meizi with 2 minutes!

BJ gets the pretty meizi with 1 minutes!


伤心,赤裸裸的bfs模板题,可是我一直把大楼的层数当成1 <= n <= 1e7。。。用了好久好久才发现问题。。。debug期间我都开始怀疑人生了,因为第二个样例一直超时,结果交了16发终AC了。这里标记入队过的楼层数时我用了不定长数组,这样方便查询

#include <cstdio>
#include <iostream>
#include <queue>
#include <cstring>
#include <cmath>
#include <vector>
#include <algorithm>
using namespace std;

vector <int> vis;
int n, k;
typedef struct N
{
    int x;
    int step;
} point;

void bfs();
bool jude(int);
bool panduan(int);
void prime();

int main()
{
    int T;
    cin>>T;
    while(T--)
    {
        vis.clear();
        cin>>n>>k;
        bfs();
    }
    return 0;
}

bool panduan(int m)
{
    if (m==1) return false;
    for(int i=2; i<=sqrt(m); i++)
        if(!(m % i))
            return false;
    return true;

}

bool jude(int x)
{
    vector<int>::iterator s =find(vis.begin(),vis.end(),x);
    if(x<1||s!=vis.end())
        return false;
    return true;
}
void bfs()
{
    point node, t;
    queue<point>  q;
    node.x=n;
    node.step=0;
    q.push(node);
    while(!q.empty())
    {
        node=q.front();
        q.pop();
        if(panduan(node.x))
        {
            if(node.step<=k)
            {
                printf("BJ gets the pretty meizi with %d minutes!\n", node.step);
                return;
            }
            else
            {
                printf("Poor BJ, single all his life!\n");
                return;
            }
        }
        t.x=node.x+1;
        if(jude(t.x))
        {
            t.step=node.step+1;
            vis.push_back(t.x);
            q.push(t);
        }

        t.x=node.x-1;
        if(jude(t.x))
        {
            t.step=node.step+1;
            vis.push_back(t.x);
            q.push(t);
        }
        t.x=2*node.x;
        if(jude(t.x))
        {
            t.step=node.step+1;
            vis.push_back(t.x);
            q.push(t);
        }
    }
    printf("Poor BJ, single all his life!\n");
    return;
}





你可能感兴趣的:(bfs)