题目链接:http://172.16.200.33/JudgeOnline/problem.php?id=1002

题意:给你两个四位数的素数,求最少经过多少步的变化能够从一个素数变到另一个素数。在变得过程中,要求都是素数,而且每个新的数和原来的数只有一位不一样。

思路:因为是四位的素数,所以先对素数打表,然后BFS,每次进入队列的是八个只有一个数字不同的四位数,并且还要是素数就入队

#include <cstdio>
#include <queue>
#include <cmath>
#include <cstring>
#include <iostream>
using namespace std;
#define M  10000
int prime[M];
 
bool isprime(int x)   //素数打表
{
  for(int i=2;i<=sqrt(x);i++)
  if(x%i==0) return false;
  return true;
}
 
void init()
{
 for(int i=1001;i<=9999;i++)
 {
  if(isprime(i)) prime[i]=1;
  else prime[i]=0;
  }
}
 
int bfs(int a,int b)
{
 queue<int>q;
 bool vis[M];
 int cout[M],t[4],temp;
 memset(vis,false,sizeof(vis));
 memset(cout,0,sizeof(cout));
 
 q.push(a);//入队
 vis[a]=true;
 
 while(!q.empty())//判断队列是否为空
 {
  int x=q.front();
  q.pop();
  t[0]=x/1000;
  t[1]=x/100%10;
  t[2]=x/10%10;
  t[3]=x%10;
 
  for(int j=0;j<4;j++)
  {
   int temp=t[j];
   for(int i=0;i<10;i++)
    if(i!=temp)
    {
     t[j]=i;
     int y=t[0]*1000+t[1]*100+t[2]*10+t[3];
     if(!vis[y]&&prime[y])
     {
      cout[y]=cout[x]+1;
      vis[y]=true;
      q.push(y);
     }
    if(y==b) return cout[y];
    }
   t[j]=temp;
  }
  if(x==b) return cout[x];
 }
 return -1;
}
int main()
{
 init();
 int n,x,t,f;
 scanf("%d",&t);
 while(t--)
 {
   scanf("%d %d",&n,&x);
 
   f=bfs(n,x);
   if(f!=-1) printf("%d\n",f);
   else      printf("Impossible\n");
  }
 return 0;
}
View Code