首页 > 代码库 > cdoj 851 方老师与素数 bfs

cdoj 851 方老师与素数 bfs

方老师与素数

Time Limit: 3000/1000MS (Java/Others)     Memory Limit: 65535/65535KB (Java/Others)
 

方老师最近很喜欢素数,他想玩一个游戏:

现在有两个44位的素数nn和mm,你一次可以改变nn的一位数字,并且改变过后的新数字必须也是个素数,并且也不能有前导00。请问使nn变为mm最少需要多少步。

例如n=1033n=1033 m=8179m=8179

那么可行的变化是:

1033173337333739377987798179

Input

第一行有一个整数T(T100)T(T≤100),代表测试数据的组数。

对于每组数据,每行有两个44位素数NMN,M(没有前导00)

Output

对于每一组数据,如果能够得到mm,输出最少的步数,否则输出Impossible

Sample input and output

Sample InputSample Output
31033 81791373 80171033 1033
670

Source

2014 UESTC Training for Search Algorithm
 
#include<bits/stdc++.h>using namespace std;#define ll long long#define pi (4*atan(1.0))#define eps 1e-14const int N=2e5+10,M=1e6+10,inf=1e9+10,mod=1e9+7;const ll INF=1e18+10;int p[1110];int prime(int n){    if(n<=1)    return 0;    if(n==2)    return 1;    if(n%2==0)    return 0;    int k, upperBound=n/2;    for(k=3; k<=upperBound; k+=2)    {        upperBound=n/k;        if(n%k==0)            return 0;    }    return 1;}int check(int x,int y){    int sum=0;    while(x)    {        if(x%10!=y%10)sum++;        x/=10;        y/=10;    }    return sum;}int flag[10010];struct is{    int num;    int ans;    is(){}    is(int x,int y)    {        num=x;        ans=y;    }};int main(){    int cnt=0;    for(int i=1000;i<=10000;i++)    if(prime(i))    p[cnt++]=i;    int T;    scanf("%d",&T);    while(T--)    {        for(int i=0;i<cnt;i++)            flag[p[i]]=0;        int n,m;        scanf("%d%d",&n,&m);        flag[n]=1;        queue<is>q;        q.push(is(n,0));        int out=inf;        while(!q.empty())        {            is v=q.front();            q.pop();            if(v.num==m)            {                out=v.ans;                break;            }            for(int i=0;i<cnt;i++)            {                if(!flag[p[i]]&&check(v.num,p[i])==1)                {                    flag[p[i]]=1;                    q.push(is(p[i],v.ans+1));                }            }        }        if(out!=inf)        printf("%d\n",out);        else            printf("Impossible\n");    }    return 0;}

 

cdoj 851 方老师与素数 bfs