poj 3126(素数打表)

先对素数进行打表处理,以后可能也会用到
对bfs思想的一个理解

/*
题意:一个四位数 ,从一个素数变成另一个素数,每次只能改变其中一位数,并且每次新形成的数字必须是素数,需要几步达到目标素数
*/
代码:

 #include<cstdio>
#include<cstring>
#include<algorithm>
#define N 10000
using namespace std;
int dis[N];
int cnt[N];
int queue[N];
bool prime[N];
void init() //对素数打表
{
    int i,j;
    for(i=1000; i<=N; i++)
    {
        for(j=2; j<i; j++)
            if(i%j==0)
            {
                prime[i]=false;
                break;
            }
        if(j==i) prime[i]=true;
    }
}
int bfs(int begin,int end)
{
    int t[4];
    int front=0,back=0;
    dis[begin]=1;
    cnt[begin]=0;
    queue[back++]=begin;
    int ttmp,mm;
    while(front<back)
    {
        int tmp=queue[front++];
        t[0]=tmp/1000;
        t[1]=tmp/100%10;
        t[2]=tmp%100/10;
        t[3]=tmp%10;
        for(int i=0;i<4;i++)
        {
            int tt=t[i];   //暂时保存这位数字,之后还原
            for(int j=0;j<10;j++)
            {
                if(j!=t[i])
                {
                    t[i]=j;
                    ttmp=t[0]*1000+t[1]*100+t[2]*10+t[3];
                    if(!dis[ttmp]&&prime[ttmp])
                    {
                        dis[ttmp]=1;
                        cnt[ttmp]=cnt[tmp]+1;
                        queue[back++]=ttmp;    //这里一定要注意,新产生的数要放到队列当中
                    }
                    if(ttmp==end) return cnt[ttmp];
                }
            }
            t[i]=tt;
        }
        if(tmp==end) return cnt[tmp];
    }
    return -1;
}
int main()
{
    int t;
    int begin,end;
    init();
    scanf("%d",&t);
    while(t--)
    {
        memset(dis,0,sizeof(dis));
        scanf("%d%d",&begin,&end);
        int ans=bfs(begin,end);
        if(ans!=-1)
        printf("%d\n",ans);
        else printf("Impossible\n");
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值