Prime Path(bfs)

版权声明:转载时 别忘了注明出处 https://blog.csdn.net/ZCY19990813/article/details/89306435

http://acm.sdibt.edu.cn/vjudge/contest/view.action?cid=2181#problem/F

Description

The ministers of the cabinet were quite upset by the message from the Chief of Security stating that they would all have to change the four-digit room numbers on their offices. 
— It is a matter of security to change such things every now and then, to keep the enemy in the dark. 
— But look, I have chosen my number 1033 for good reasons. I am the Prime minister, you know! 
— I know, so therefore your new number 8179 is also a prime. You will just have to paste four new digits over the four old ones on your office door. 
— No, it’s not that simple. Suppose that I change the first digit to an 8, then the number will read 8033 which is not a prime! 
— I see, being the prime minister you cannot stand having a non-prime number on your door even for a few seconds. 
— Correct! So I must invent a scheme for going from 1033 to 8179 by a path of prime numbers where only one digit is changed from one prime to the next prime. 

Now, the minister of finance, who had been eavesdropping, intervened. 
— No unnecessary expenditure, please! I happen to know that the price of a digit is one pound. 
— Hmm, in that case I need a computer program to minimize the cost. You don't know some very cheap software gurus, do you? 
— In fact, I do. You see, there is this programming contest going on... Help the prime minister to find the cheapest prime path between any two given four-digit primes! The first digit must be nonzero, of course. Here is a solution in the case above. 

1033 
1733 
3733 
3739 
3779 
8779 
8179

The cost of this solution is 6 pounds. Note that the digit 1 which got pasted over in step 2 can not be reused in the last step – a new 1 must be purchased.

Input

One line with a positive number: the number of test cases (at most 100). Then for each test case, one line with two numbers separated by a blank. Both numbers are four-digit primes (without leading zeros).

Output

One line for each case, either with a number stating the minimal cost or containing the word Impossible.

Sample Input

3
1033 8179
1373 8017
1033 1033
Sample Output

6
7
0
题意:给出两个数x,y,求x最少经过几步可以变换成y,前提是变化都是素数,每一位都可以变化一个数字,一次只能变化一个。
#include <iostream>
#include <algorithm>
#include <cstring>
#include <cmath>
#include <vector>
#include <map>
#include <string>
#include <deque>
#include <queue>
#include <cstdio>
#include <cstdlib>
#include <set>
#define MAX 0x3f3f3f3f
using namespace std;
typedef long long ll;
const int M=1e5+10;
int aa[M];
priority_queue <int,vector<int>,greater<int> > q;
struct node
{
    int x;
    int time;
} start,now,ff;
int vis[M]={0};
queue <node> dq;
void cc(int x,int tt)//用来求x可以变化成什么数,满足就放到队列里面
{
    ll e=0,a,b,y;
    a=x%10,b=x/10%10;
    ll c=x/100%10,d=x/1000;
    for(ll i=0;i<=9;i++)
    {
        if(a!=i)
        {
            y=d*1000+c*100+b*10+i;
            if(aa[y]==0&&y>=1000&&vis[y]==0)
            {
                ff.x=y;
                ff.time=tt+1;
                dq.push(ff);
                vis[y]=1;
            }
        }
        if(b!=i)
        {
            y=d*1000+c*100+i*10+a;
            if(aa[y]==0&&y>=1000&&vis[y]==0)
            {
                ff.x=y;
                ff.time=tt+1;
                dq.push(ff);
                vis[y]=1;
            }
        }
        if(c!=i)
        {
            y=d*1000+i*100+b*10+a;
            if(aa[y]==0&&y>=1000&&vis[y]==0)
            {
                ff.x=y;
                ff.time=tt+1;
                dq.push(ff);
                vis[y]=1;
            }
        }
        if(d!=i)
        {
            y=i*1000+c*100+b*10+a;
            if(aa[y]==0&&y>=1000&&vis[y]==0)
            {
                ff.x=y;
                ff.time=tt+1;
                dq.push(ff);
                vis[y]=1;
            }
        }
    }
}
int bfs(int x,int y)
{
    start.x=x;
    start.time=0;
    vis[x]=1;
    dq.push(start);
    while(!dq.empty())
    {
        now=dq.front();
        dq.pop();
        if(now.x==y)
            return now.time;
        cc(now.x,now.time);
    }
}
int main()
{
    memset(aa,0,sizeof(aa));
    for(ll i=2; i<=10000; i++)//素数打表
    {
        if(aa[i]==0)
        {
            for(ll j=i+i; j<=10000; j+=i)
                aa[j]=1;
        }
    }
    int t,i,j,n,m;
    cin>>t;
    while(t--)
    {
        memset(vis,0,sizeof(vis));
        while(!dq.empty())
            dq.pop();
        int x,y;
        cin>>x>>y;
        int ans=bfs(x,y);
        cout<<ans<<endl;
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/ZCY19990813/article/details/89306435