• 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
    ");
            else printf("%d
    ",m[y]);
        }
        return 0;
    }
  • 相关阅读:
    2012暑期川西旅游之第六天(四姑娘山达维夹金山邛崃青城山)
    实现元素拖拽
    asp.net学习资源
    080402 晴れ
    送给Rain的文章
    两天后见
    若水三千
    关于下一代的教育
    20080408 大雨
    Missing You
  • 原文地址:https://www.cnblogs.com/zufezzt/p/5370042.html
Copyright © 2020-2023  润新知