题目链接:http://poj.org/problem?id=3126
题意:T组数据,每组数据给你两个素数,要求从第一个素数转换到第二个素数,每次只能任意变动一个数位。求最小操作数。
简单BFS,每次改变一个数位都是一个状态
#include<map>
#include<set>
#include<cmath>
#include<stack>
#include<queue>
#include<deque>
#include<string>
#include<vector>
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#define LL long long
#define PI 3.1415926
#define INF 0x3f3f3f3f
using namespace std;
const int MAXN = 10000+10;
int n,vis[MAXN],a,b,cur,next,su[MAXN];
bool isprime[MAXN];
void prime() //素数筛选
{
int cnt=1;
memset(isprime,1,sizeof(isprime));
isprime[0]=isprime[1]=0;
for(long long i=2;i<=9999;i++)
{
if(isprime[i])
su[cnt++]=i;
for(long long j=1;j<cnt&&su[j]*i<MAXN;j++)
{
isprime[su[j]*i]=0;
}
}
}
void bfs()
{
memset(vis,0,sizeof vis);
queue<int> que;
cur = a;
vis[cur] = 1;
que.push(cur);
while(que.size())
{
cur = que.front();
que.pop();
for(int i = 1; i <= 1000; i*=10)
{
for(int j = 0; j <= 9; ++j)
{
if(i==1000 && !j) //首位不能为0
continue;
next = cur-cur/i%10*i+j*i;
if(!isprime[next]) continue;
if(next == b)
{
cout<<vis[cur]<<'\n';
return;
}
if(!vis[next])
{
vis[next] = vis[cur]+1;
que.push(next);
}
}
}
}
}
int main(void)
{
int T;
prime();
cin>>T;
while(T--)
{
cin>>a>>b;
if(a==b)
cout<<"0\n";
else
bfs();
}
}