简单的bfs题目。
题目的意思是说告诉你两个四位数,这两个数都是素数,你能进行的操作是改变当前数字中的某一位,(第一位不为0),仍保证改变后的数是素数,问你最少经过多少次变化能将输入的第一个数变成第二个数。
为了提高效率,先打出1000-9999的素数表,按照要求进行BFS遍历即可
#include<cstdio>
#include<queue>
#include<cstring>
using namespace std;
const int Maxsize = 10010;
bool cnt[Maxsize],vis[Maxsize];
int prime[Maxsize],len;
typedef struct/*bfs结点信息*/
{
int v,d;
}node;
void primeset()/*提前打出1000-9999的素数表*/
{
memset(cnt,false,sizeof(cnt));
len = 0;
cnt[0] = true;
cnt[1] = true;
for(int i = 2 ; i <= 10000 ; i++)
{
if(!cnt[i] && i >= 1000)
{
prime[len++] = i;
}
for(int j = 2*i ; j <= 10000 ; j+=i)
{
cnt[j] = true;
}
}
}
int judge(int a,int b)/*判断是否能进行转化*/
{
int cnt = 0;
for(int i = 3 ; i >= 0 ; i--)
{
if(a%10 == b%10)
{
cnt++;
}
a/=10;
b/=10;
}
if(cnt == 3)
{
return 1;
}
else
{
return 0;
}
}
int bfs(int a,int b)/*bfs搜索*/
{
queue<node>q;
memset(vis,false,sizeof(vis));
node cur,pre;
cur.v = a;
cur.d = 0;
q.push(cur);
while(!q.empty())
{
cur = q.front();
q.pop();
if(cur.v == b)
{
return cur.d;
}
for(int i = 0 ; i < len ; i++)
{
if(judge(cur.v,prime[i]) && !vis[i])
{
vis[i] = true;
pre.v = prime[i];
pre.d = cur.d + 1;
q.push(pre);
}
}
}
}
int main()
{
primeset();
int ncase,n,m;
scanf("%d",&ncase);
while(ncase--)
{
scanf("%d %d",&n,&m);
int ans = bfs(n,m);
printf("%d\n",ans);
}
return 0;
}