Prime Path POJ - 3126

bfs水题吧,这题没什么好说的,比较有价值的地方有两点。 ①:有关memset的问题  ② 把一个四位数,千、百、十、个位分离的方法

#include <cstdio>

#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
const int MAXN = 10000;
int   que[MAXN];
int prime[MAXN];
int vis[MAXN];
int a,b;
int step[MAXN];
void isprime()
{
    f or(int i=2;i<=MAXN;i++) prime[i]=1; //memset不能赋1,只能0和-1
    prime[0]=prime[1]=0;
    for(int i=2;i<=MAXN;i++)
    {
        if(prime[i]==1)
        {
            for(int j=i+i;j<=MAXN;j+=i)
            {
                prime[j]=0;
            }
        }
    }
}
void bfs()
{
    int ft=0,ed=0;
    que[ed++]=a;
    vis[a]=1;
    step[a]=0;
    while(ft<ed)
    {
        int x=que[ft++];
        vis[x]=1;
        for(int i=1;i<=9;i+=2)
        {
            int nx=x/10*10+i;
            if(vis[nx]==0 && prime[nx]==1)
            {
                vis[nx]=1;
                que[ed++]=nx;
                step[nx]=step[x]+1;
                if(nx==b)
                {
                    printf("%d\n",step[nx]);
                    return ;
                }
            }
        }
        for(int i=0;i<=9;i++)
        {
            int nx=x/100*100+x%10+i*10;
            if(vis[nx]==0 && prime[nx]==1)
            {
                vis[nx]=1;
                que[ed++]=nx;
                step[nx]=step[x]+1;
                if(nx==b)
                {
                    printf("%d\n",step[nx]);
                    return ;
                }
            }
        }


        for(int i=0;i<=9;i++)
        {
            int nx=x/1000*1000+x%100+i*100;
            if(vis[nx]==0 && prime[nx]==1)
            {
                vis[nx]=1;
                que[ed++]=nx;
                step[nx]=step[x]+1;
                if(nx==b)
                {
                    printf("%d\n",step[nx]);
                    return ;
                }
            }
        }


        for(int i=1;i<=9;i++)
        {
            int nx=x%1000+i*1000;
            if(vis[nx]==0 && prime[nx]==1)
            {
                vis[nx]=1;
                que[ed++]=nx;
                step[nx]=step[x]+1;
                if(nx==b)
                {
                    printf("%d\n",step[nx]);
                    return ;
                }
            }
        }
    }
}
int main()
{
    isprime();
    int t;
    cin >> t;
    while(t--)
    {
        memset(vis,0,sizeof(vis));
        memset(step,0,sizeof(step));
        cin >> a >> b;
        if(a==b)
        {
            printf("0\n");
            continue;
        }
        bfs();
        if(step[b]==0)
        printf("Impossible\n");
    }
}
全部评论

相关推荐

点赞 收藏 评论
分享
牛客网
牛客企业服务