代码行

会飞的代码

F - Prime Path(vj)

bfs+队列,分别从各位,十位,百位,千位搜索,素数打表……


#include<bits/stdc++.h>
using namespace std;
int prim[10005]={0};
int step[10005];
bool vis[10005];
int m,n;
queue<int>Q;
void f()
{
    for(int i=1001;i<10000;i+=2)
    {
        int flag=1;
        for(int j=2;j*j<=i;j++)
        {
            if(i%j==0)
            {
                flag=0;
                break;
            }
        }
        if(flag) prim[i]=1;
    }
}
void bfs()
{
    int head,next;
    Q.push(m);
    vis[m]=true;
    step[m]=0;
    while(!Q.empty())
    {
        head=Q.front();
        Q.pop();
        if(head==n)
        {
            printf("%d\n",step[head]);
            return ;
        }
        for(int i=1;i<=9;i+=2)//个位
        {
            next=head/10*10+i;
            if(next!=head&&!vis[next]&&prim[next])
            {
                vis[next]=true;
                Q.push(next);
                step[next]=step[head]+1;
            }
        }
        for(int i=0;i<=9;i++)//十位
        {
            next=head/100*100+i*10+head%10;
            if(next!=head&&!vis[next]&&prim[next])
            {
                vis[next]=true;
                Q.push(next);
                step[next]=step[head]+1;
            }
        }
        for(int i=0;i<=9;i++)//百位
        {
            next=head/1000*1000+i*100+head%100;
            if(next!=head&&!vis[next]&&prim[next])
            {
                vis[next]=true;
                Q.push(next);
                step[next]=step[head]+1;
            }
        }
        for(int i=1;i<=9;i++)//千位
        {
            next=i*1000+head%1000;
            if(next!=head&&!vis[next]&&prim[next])
            {
                vis[next]=true;
                Q.push(next);
                step[next]=step[head]+1;
            }
        }
    }
    printf("Impossible!\n");
    return ;
}
int main()
{
    f();
    int t;
    scanf("%d",&t);
    while(t--)
    {
        scanf("%d%d",&m,&n);
        if(m==n)
        {
            printf("0\n");
            continue;
        }
        while(!Q.empty()) Q.pop();
        memset(step,0,sizeof(step));
        memset(vis,false,sizeof(vis));
        bfs();
    }
    return 0;
}
阅读更多
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_41061455/article/details/80348802
文章标签: bfs
个人分类: bfs
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

不良信息举报

F - Prime Path(vj)

最多只允许输入30个字

加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!
关闭
关闭