CSU1090-Number Transformation-BFS

K: Number Transformation

Description

In this problem, you are given a pair of integers A and B. You can transform any integer number A to B by adding x to A.This x is an integer number which is a prime below A.Now,your task is to find the minimum number of transformation required to transform S to another integer number T.

Input

Input contains multiple test cases.Each test case contains a pair of integers S and T(0< S < T <= 1000) , one pair of integers per line.

Output

For each pair of input integers S and T you should output the minimum number of transformation needed as Sample output in one line. If it’s impossible ,then print ‘No path!’ without the quotes.

Sample Input

5 7
3 4

Sample Output

Need 1 step(s)
No path!

我的思路:打素数表然后BFS(就是喜欢简单粗暴)

#include <bits/stdc++.h>
#define N 10100
#define INF 0x3f3f3f3f
#define LL long long
#define mem(a,n) memset(a,n,sizeof(a))
#define fread freopen("in.txt","r",stdin)
#define fwrite freopen("out.txt","w",stdout)
using namespace std;
const int prime[241]={2,3,5,7,11,13,17,19,23,29,31,37,41,43,47,53,59,61,67,71,73,79,83,89,97,101,103,107,109,113,127,131,137,139,149,151,157,163,167,173,179,181,191,193,197,199,211,223,227,229,233,239,241,251,257,263,269,271,277,281,283,293,307,311,313,317,331,337,347,349,353,359,367,373,379,383,389,397,401,409,419,421,431,433,439,443,449,457,461,463,467,479,487,491,499,503,509,521,523,541,547,557,563,569,571,577,587,593,599,601,607,613,617,619,631,641,643,647,653,659,661,673,677,683,691,701,709,719,727,733,739,743,751,757,761,769,773,787,797,809,811,821,823,827,829,839,853,857,859,863,877,881,883,887,907,911,919,929,937,941,947,953,967,971,977,983,991,997}; 
bool vis[1010];
int main()
{
//  ios::sync_with_stdio(false);
    queue<pair<int,int> > q;
    int n,m,ans;
    while(cin>>n>>m){
        ans=0;
        mem(vis,0);
        while(!q.empty()){
            q.pop();
        }
        q.push(make_pair(n,0));
        while(!q.empty()){
            int temp=q.front().first,tempcnt=q.front().second;
            q.pop();
            if(temp==m){
                ans=tempcnt;
                break;
            }for(int i=0;i<241;++i){
                if(prime[i]>=temp){
                    break;
                }
                if(temp+prime[i]<=m&&!vis[temp+prime[i]]){
                    q.push(make_pair(temp+prime[i],tempcnt+1));
                    vis[temp+prime[i]]=true;
                }
            }
        }
        if(ans){
            printf("Need %d step(s)\n",ans);
        }else{
            cout<<"No path!"<<endl;
        }
    }
    return 0;
}


/**********************************************************************
    Problem: 1090
    User: CSUzick
    Language: C++
    Result: AC
    Time:68 ms
    Memory:1700 kb
**********************************************************************/
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值