题目大意:给一个四位数,最小次数变成另外一个四位数,每次变一位,并且中间都只能是prime
思路:筛法求prime,然后BFS
#include <cstdio>
#include <cstdlib>
#include <string.h>
#include <string>
#include <math.h>
#include <algorithm>
#include <iostream>
#include <queue>
#include <stack>
#include <map>
#include <set>
using namespace std;
bool prime[10000], vis[10000];
int cases;
string s,t;
void sieve()
{
memset(prime,true,sizeof(prime));
prime[0]=prime[1]=false;
for(int i=2;i<=9999;i++)
{
if(prime[i])
{
for(int j=2;j<=9999;j++)
{
if(i*j>9999) break;
prime[i*j]=false;
}
}
}
}
int bfs()
{
int step=0;
memset(vis,false,sizeof(vis));
queue<string>q,qq,tmp;
q.push(s);
vis[atoi(s.c_str())]=true;
while(!q.empty())
{
while(!q.empty())
{
string tt=q.front();
q.pop();
if(atoi(tt.c_str())==atoi(t.c_str())) return step;
for(int i=3;i>=0;i--)
{
int jbegin=i==0?1:0;
string t2=tt;
for(int j=jbegin;j<=9;j++)
{
t2[i]=j+'0';
int t3=atoi(t2.c_str());
if(!vis[t3] && prime[t3] && t3!=atoi(tt.c_str()))
{
vis[t3]=true;
qq.push(t2);
}
}
}
}
tmp=q;
q=qq;
qq=tmp;
step++;
}
return -1;
}
int main()
{
sieve();
cin>>cases;
while(cases--)
{
cin>>s>>t;
cout<<bfs()<<endl;
}
return 0;
}