POJ3126-Prime Path

題目鏈接:點擊打開鏈接

在bfs裏,也可用其他方式做,bfs的話思路還是挺簡單的,不過因爲是四位數,所以搜千的時候要從1開始,注意標記。

//260K	0MS
//C++	1825B
#include <cstdio>
#include <cstring>
#define N 10000
int sum;
int q[N],dis[N],vis[N];
int a[N],k=0;
void ssh()
{
    memset(a,0,sizeof(a));
    int i,l;
    for(i=2;i<=3200;i++)
        if(!a[i])
            for(l=i;l*i<=N;l++)
                a[l*i]=1;
}
int bfs(int x,int y)
{
    memset(vis,0,sizeof(vis));
    int in=0,out=0,i;
    dis[in]=0;
    q[in++]=x;
    vis[x]=1;
    while(in>out)
    {
        int di=dis[out];
        int k=q[out++];
        vis[k]=1;
        if(k==y)
        {
            return di;
        }
        if(k>=10000||di>=100) 
            return -1;
        int n,l;
        n=k%1000;
        for(i=1;i<10;i++)
        {

            int p=i*1000+n;
            if(!a[p]&&!vis[p])
            {
                vis[p]=1;
                dis[in]=di+1;
                q[in++]=p;
            }
        }
        n=k%100;
        l=k/1000;
        for(i=0;i<10;i++)
        {
            int p=l*1000+i*100+n;
            if(!a[p]&&!vis[p])
            {
                vis[p]=1;
                dis[in]=di+1;
                q[in++]=p;
            }
        }
        n=k%10;
        l=k/100;
        for(i=0;i<10;i++)
        {
            int p=l*100+i*10+n;
            if(!a[p]&&!vis[p])
            {
                vis[p]=1;
                dis[in]=di+1;
                q[in++]=p;
            }
        }
        l=k/10;
        for(i=0;i<10;i++)
        {
            int p=l*10+i;
            if(!a[p]&&!vis[p])
            {
                vis[p]=1;
                dis[in]=di+1;
                q[in++]=p;
            }
        }
    }
}
int main()
{
    ssh();
    int i,n,x,y;
    scanf("%d",&n);
    for(i=0;i<n;i++)
    {
        scanf("%d%d",&x,&y);
        x=bfs(x,y);
        if(x!=-1)
            printf("%d\n",x);
        else
            printf("Impossible\n");
    }
    return 0;
}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章