CD0J/POJ 851/3126 方老师与素数/Prime Path BFS

Prime Path
Time Limit: 1000MS   Memory Limit: 65536K
Total Submissions: 9982   Accepted: 5724

Description

CD0J/POJ 851/3126 方老师与素数/Prime Path BFSThe 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


#include <cstdio>

#include <cmath>

#include <cstring>

#include <ctime>

#include <iostream>

#include <algorithm>

#include <set>

#include <vector>

#include <sstream>

#include <queue>

#include <typeinfo>

#include <fstream>

typedef long long ll;

using namespace std;

//freopen("D.in","r",stdin);

//freopen("D.out","w",stdout);

#define sspeed ios_base::sync_with_stdio(0);cin.tie(0)

#define maxn 100001

const int inf=0x7fffffff;   //无限大

const int MAXN = 10000;

bool flag[MAXN];

int primes[MAXN], pi;

struct point

{

    int x;

    int y;

};

void GetPrime_1()

{

    int i, j;

    pi = 0;

    memset(flag, false, sizeof(flag));

    for (i = 2; i < MAXN; i++)

        if (!flag[i])

        {

            primes[i] = 1;//素数标识为1

            for (j = i; j < MAXN; j += i)

                flag[j] = true;

        }

}

int vis[maxn];

int main()

{

    GetPrime_1();

    int t;

    cin>>t;

    while(t--)

    {

        memset(vis,0,sizeof(vis));

        int n,m;

        cin>>n>>m;

        vis[n]=1;

        queue<point> q;

        q.push((point){n,0});

        int flag1=0;

        while(!q.empty())

        {

            point now=q.front();

            if(now.x==m)

            {

                flag1=now.y;

                break;

            }

            point next;

            for(int i=0;i<=9;i++)

            {

                next.x=now.x/10;

                next.x*=10;

                next.x+=i;

                next.y=now.y+1;

                if(next.x<1000||next.x>=10000)

                    continue;

                if(vis[next.x]==1)

                    continue;

                if(next.x==m)

                {

                    flag1=next.y;

                    break;

                }

                if(primes[next.x]==1)

                {

                    //cout<<next.x<<endl;

                    vis[next.x]=1;

                    q.push(next);

                }



            }

            for(int i=0;i<=9;i++)

            {

                int temp=now.x%10;

                next.x=now.x/100;

                next.x*=100;

                next.x+=i*10;

                next.x+=temp;

                if(next.x<1000||next.x>=10000)

                    continue;

                if(vis[next.x]==1)

                    continue;

                if(next.x==m)

                {

                    flag1=next.y;

                    break;

                }

                if(primes[next.x]==1)

                {

                    //cout<<next.x<<endl;

                    vis[next.x]=1;

                    q.push((point){next.x,now.y+1});

                }

            }

            for(int i=0;i<=9;i++)

            {

                int temp=now.x%100;

                next.x=now.x/1000;

                next.x*=1000;

                next.x+=i*100;

                next.x+=temp;

                if(next.x<1000||next.x>=10000)

                    continue;

                if(vis[next.x]==1)

                    continue;

                if(next.x==m)

                {

                    flag1=next.y;

                    break;

                }

                if(primes[next.x]==1)

                {

                    //cout<<next.x<<endl;

                    vis[next.x]=1;

                    q.push((point){next.x,now.y+1});

                }

            }

            for(int i=0;i<=9;i++)

            {

                int temp=now.x%1000;

                next.x=now.x/10000;

                next.x*=10000;

                next.x+=i*1000;

                next.x+=temp;

                if(next.x<1000||next.x>=10000)

                    continue;

                if(vis[next.x]==1)

                    continue;

                if(next.x==m)

                {

                    flag1=next.y;

                    break;

                }

                if(primes[next.x]==1)

                {

                //    cout<<next.x<<endl;

                    vis[next.x]=1;

                    q.push((point){next.x,now.y+1});

                }

            }

            if(flag1>0)

            break;

            q.pop();

        }

    printf("%d\n",flag1);

    }

    return 0;

}

 

你可能感兴趣的:(Path)