[LYOI25]素数路

来源:互联网 发布:网络推广信息方案 编辑:程序博客网 时间:2024/06/05 00:12

题目介绍

题目描述

把一个4位素数 N 通过 K 次转换变成4位素数 M 输出 K 的最小值。
转换要求:只能改变数 N 中的一位(没有前导零)而且在转换过程中的每个数也要为素数。


输入格式

一行,两个四位的素数(没有前导零),表示初始数 N 和目标数 M 。


输出格式

一个数,表示最少的操作次数 K 。如果不可能,输出 “Impossible”。


输入样例

1033 8179


输出样例

6


数据范围与提示

对于100%的数据,满足1000<N,M<10000;


题目思路

此题正解为bfs。首先把N加入队列,接下来每次只要分解每一位,依次变换,检验变换的数是否为素数,若是则加入队列即可。但是本题我们应该考虑,变换过程中可能出现大量重复的数,所以可以进行一次预处理,求出素数表即可。


代码

#include <cstdio>#include <queue>#include <cmath>#include <cstring>#define MAXN 10000std::queue <int> que;int visit[MAXN];int isPrime[MAXN];int n,k;int steps;int ans[101];int possible;void getPrime(){    memset(isPrime,1,sizeof(isPrime));    for(int i=1000;i<10000;i++){        for(int j=2;j<=sqrt((double)i);j++){            if(i%j==0){                isPrime[i]=0;                break;            }        }    }}void judge(int n){    if(!visit[n]&&isPrime[n]){        visit[n]=1;        que.push(n);    }}void bfs(int n,int k){    int head,que_size,next;    memset(visit,0,sizeof(visit));    possible=0;    steps=0;    while(!que.empty())        que.pop();    visit[n]=1;    que.push(n);    while(!que.empty())              //lever order traverse      {          que_size=que.size();            while(que_size--)                                    {                head=que.front();                que.pop();               if(head==k)               {                  possible=1;                  return;                }             for(int i=0;i<=9;i++)    {                    if(i&&i!=head/1000)                          //变换千位                  {                      next=i*1000+head%1000;                      judge(next);                  }                  if(i!=(head%1000)/100)                       //变换个位                  {                      next=(head/1000)*1000+i*100+head%100;                          judge(next);                  }                  if(i!=(head%100)/10)                         //变换十位                  {                      next=(head/100)*100+i*10+head%10;                      judge(next);                  }                  if(i!=head%10)                               //变换个位                  {                      next=(head/10)*10+i;                      judge(next);                  }              }         }    steps++;    }}int main()  {    int test_cases;    getPrime();        scanf("%d%d",&n,&k);        bfs(n,k);        if(possible) printf("%d\n",steps);        else printf("Impossible\n");    return 0;}  
原创粉丝点击