Prime Path
大意:给你两个数,求从第一个数经过几次变换到第二个数。变换要求:1.中间数必须是素数 2.每次只能变一个数字。
思路:对每一位数字进行bfs
#include <map>
#include <stack>
#include <queue>
#include <math.h>
#include <stdio.h>
#include <string.h>
#include <iostream>
#include <limits.h>
#include <algorithm>
#define LL long long
#define min(a,b) (a>b?b:a)
#define max(a,b) (a>b?a:b)
#define eps 1e-9
#define INF 1 << 30
using namespace std;
int a, b, Ans;
bool flag[10000];
int vis[10000] = {0};
void prime()
{
int k, j;
for(int i = 1001; i < 10000; i+=2)
{
k = sqrt(i*1.0);
for(j = 2; j <= k; j++)
if(i % j == 0)
break;
if(j >= k + 1)
flag[i] = 1;
}
}
void BFS()
{
int t;
int i;
int p1, p2, p3;
queue<int> q;
q.push(a);
vis[a] = true;
p1 = 0;
p2 = p3 = 1;
while (!q.empty())
{
t = q.front();
q.pop();
p1++;
if (t == b)
return;
int next;
for (i = 1; i <= 9; i++)
{
next = t%1000;
next += i*1000;
if (flag[next] && !vis[next])
{
vis[next] = true;
q.push(next);
p2++;
}
}
for (i = 0; i <= 9; i++)
{
int temp;
temp = t/100%10;
next = t-temp*100;
next += i*100;
if (flag[next] && !vis[next])
{
vis[next] = true;
q.push(next);
p2++;
}
}
for (i = 0; i <= 9; i++)
{
int temp;
temp = t/10%10;
next = t-temp*10;
next += i*10;
if (flag[next] && !vis[next])
{
vis[next] = true;
q.push(next);
p2++;
}
}
for (i = 0; i <= 9; i++)
{
int temp;
temp = t%10;
next = t-temp;
next += i;
if (flag[next] && !vis[next])
{
vis[next] = true;
q.push(next);
p2++;
}
}
if (p1 == p3)
{
Ans++;
p3 = p2;
}
}
}
void Solve()
{
int n;
cin >> n;
while(n--)
{
cin >> a >> b;
memset(vis, 0, sizeof(vis));
Ans = 0;
BFS();
cout << Ans << endl;
}
}
int main(void)
{
//freopen("data.in", "r", stdin);
//freopen("data.out", "w", stdout);
prime();
Solve();
return 0;
}