POJ 3126 Prime Path

广搜。

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

int T;
int x,y;
int dig[6],tot;
int m[20000];
const int INF=0x7FFFFFFF;
int f[20000];

bool F(int x)
{
    if(x==2) return 1;
    if(x<=1) return 0;
    if(x%2==0) return 0;
    for(int i=2; i*i<=x; i++)
        if(x%i==0) return 0;
    return 1;
}

void bfs()
{
    queue<int>Q;
    Q.push(x);
    while(!Q.empty())
    {
        int head=Q.front(); Q.pop();
        int tmp=head;
        tot=0;
        while(tmp) dig[tot++]=tmp%10,tmp=tmp/10;
        int a=dig[3],b=dig[2],c=dig[1],d=dig[0];
        int e=a*1000+b*100+c*10+d;
        if(e==y) break;
        for(int i=1; i<=9; i++)
        {
            int num=i*1000+b*100+c*10+d;
            if(f[num]&&m[e]+1<m[num])
            {
                m[num]=m[e]+1;
                Q.push(num);
            }
        }

        for(int i=0; i<=9; i++)
        {
            int num=a*1000+i*100+c*10+d;
            if(f[num]&&m[e]+1<m[num])
            {
                m[num]=m[e]+1;
                Q.push(num);
            }
        }

        for(int i=0; i<=9; i++)
        {
            int num=a*1000+b*100+i*10+d;
            if(f[num]&&m[e]+1<m[num])
            {
                m[num]=m[e]+1;
                Q.push(num);
            }
        }

        for(int i=1; i<=9; i=i+2)
        {
            int num=a*1000+b*100+c*10+i;
            if(f[num]&&m[e]+1<m[num])
            {
                m[num]=m[e]+1;
                Q.push(num);
            }
        }
    }
}

int main()
{
    memset(f,0,sizeof f);
    for(int i=1000; i<=9999; i++) if(F(i)) f[i]=1;
    scanf("%d",&T);
    while(T--)
    {
        for(int i=1000; i<=9999; i++) m[i]=INF;
        scanf("%d%d",&x,&y);
        m[x]=0;
        bfs();
        if(m[y]==INF) printf("Impossible\n");
        else printf("%d\n",m[y]);
    }
    return 0;
}

 

posted @ 2016-04-08 21:26  Fighting_Heart  阅读(202)  评论(0编辑  收藏  举报