题目链接:
https://vjudge.net/problem/POJ-3126
题目大意:
给两个四位数a,b 每次改变a中的一位而且改动之后的必须是素数,问最少改动几次可以到b?(永远达不到b就输出impossible)
思路:
素数打表更好直接判断,然后BFS,用力一点小技巧可以直接生成所有可到达的点
#include<iostream>
#include<vector>
#include<queue>
#include<algorithm>
#include<cstring>
#include<cstdio>
#include<set>
#include<map>
#include<cmath>
using namespace std;
typedef pair<int, int> Pair;
typedef long long ll;
const int INF = 0x3f3f3f3f;
int T, n, m;
const int maxn = + ;
bool is_prime[maxn];
void init()
{
for(int i = ; i < maxn; i++)is_prime[i] = ;
for(int i = ; i * i < maxn; i++)
{
if(is_prime[i])
{
for(int j = i * i; j < maxn; j += i)is_prime[j] = ;
}
}
//for(int i = 0; i < maxn; i++)if(is_prime[i])cout<<i<<endl;
}
bool v[maxn];
void bfs()
{
int a[], b[];
b[] = , b[] = , b[] = , b[] = ;
queue<Pair>q;
memset(v, , sizeof(v));
q.push(Pair(n, ));
v[n] = ; while(!q.empty())
{
Pair now = q.front();
q.pop();
int x = now.first;
if(x == m)
{
cout<<now.second<<endl;
return;
}
a[] = x % ;//每一位置为0
a[] = x - x / % * ;
a[] = x - x / % * ;
a[] = x - x % ;
for(int i = ; i < ; i++)//生成所有的可变化的四位数
{
for(int j = ; j < ; j++)
{
int y = a[i] + j * b[i];
if(y < || y == x || !is_prime[y] || v[y])continue;
v[y] = ;
q.push(Pair(y, now.second + ));
}
}
}
cout<<"Impossible"<<endl;
return;
}
int main()
{
init();
cin >> T;
while(T--)
{
cin >> n >> m;
bfs();
}
}