prime path (bfs)

 

#include <stdio.h>
#include <cmath>
#include <cstring>
#include <queue>
#define maxs 100005
using namespace std;
int b[maxs],visit[maxs];
void prtable()
{
    int i,j;
    for (i=1000;i<10000;i++)
    {
        b[i]=1;
        for (j=2;j<=sqrt(i);j++)  //不要忘了等号
        if (i%j==0)
        {b[i]=0;break;}
    }     //借鉴的打表
}
int change (int s , int i)
{
    int j,a[5];
    for(j=0;j<4;j++)//数组实现
    {
        a[j]=s%10;
        s/=10;
    }
    a[i-1]=0;
    for(j=0;j<4;j++)
        {s+=a[j]*pow(10,j);}
    return s;
}
int main()
{
    int n,a,c,time,i,t,tt,s,s1,j,fine;
    scanf("%d",&n);
    prtable();
    while (n--)
    {
        scanf("%d%d",&a,&c);
        if (a==c)
        {printf("0\n");continue;}
        time=0,fine=0;
        queue <int> Q;
        memset(visit,0,sizeof(visit));
        Q.push (a);
        visit[a]=1;
        while (!Q.empty() && !fine)
        {
            tt=Q.size();//队列里元素的个数
            time++;
            while(tt--)
            {
                s=Q.front();
                Q.pop();
                for (i=1;i<=4;i++)
                {
                    t=change(s,i);
                    for (j=0;j<=9;j++)
                    {
                        s1=t+j*pow(10,i-1);
                        if (s1==c)
                        {fine=1;goto er;}
                        else if( b[s1] && !visit[s1])
                        {Q.push(s1);visit[s1]=1;}
                    }
                }
            }

        }
       er:  if(fine)
        printf("%d\n",time);
        else
        printf("Impossible\n");

    }
    return 0;
}
posted @ 2013-11-24 17:34  单调的幸福  阅读(230)  评论(0编辑  收藏  举报