POJ 3126 Prime Path

来源:互联网 发布:淘宝默认宝贝详情页 编辑:程序博客网 时间:2024/05/09 01:49

BFS。

一个质数至少要变多少次才能到另外一个质数。

中间变得数也必须是质数。每次变换一个位置。

Sample Input

31033 81791373 80171033 1033

Sample Output

670

记得判断找出来的数是否是质数,最好打印1000——10000的质数表(很多办法)。

然后记得标记数是否被搜索到。

#include<stdio.h>#include<string.h>#include<math.h>int a,b,ans,top,end;short q[10001];short flag[10001];short prime[10001];int isprime(){    int i,j,k;    for(i=1001;i<10000;i+=2)    {        k=sqrt(i*1.0);        for(j=2;j<=k;j++)        if(i%j==0)            break;        if(j>=k+1)            flag[i]=1;    }}int bfs(){    int i,j;    q[end]=a;    while(1)    {        short ok=0;        for(i=end;i<=top;i++)        {            if(q[i]==b)return 1;            prime[q[i]]=1;        }        for(i--;end<=i;end++)        {            int t;            for(j=1;j<=9;j++)            {                t=q[end]%1000+j*1000;                if(flag[t]&&!prime[t])                q[++top]=t,ok=1;            }            for(j=0;j<=9;j++)            {                t=q[end]/1000*1000+q[end]%100+j*100;                if(flag[t]&&!prime[t])                q[++top]=t,ok=1;            }            for(j=0;j<=9;j++)            {                t=q[end]/100*100+q[end]%10+j*10;                if(flag[t]&&!prime[t])                q[++top]=t,ok=1;            }            for(j=0;j<=9;j++)            {                t=q[end]/10*10+j;                if(flag[t]&&!prime[t])                q[++top]=t,ok=1;            }        }        if(!ok)return 0;        ans++;    }}int main(){    int n;    memset(flag,0,sizeof(flag));    isprime();    while(~scanf("%d",&n))    {        while(n-->0)        {            memset(prime,0,sizeof(prime));            scanf("%d%d",&a,&b);            ans=end=0,top=1;            if(bfs())            printf("%d\n",ans);            else            printf("Impossible\n");        }    }}



原创粉丝点击