题解
一开始没有看懂什么意思,题目大意:一个数x最少经过多少次变换可以变成y,要求每次变换一位,每次变换之后的数都是素数。
4位数,就是实验呗。
个位数 1,3,5,7,9 (要求是素数)
十位数、百位数 0 - 9
千位数 1 - 9
在bfs里弄4个for循环解决
#include <iostream>
#include <queue>
#include <cstring>
using namespace std;
bool prime[10005];
// 筛法求素数
void init()
{
memset(prime, true, sizeof(prime));
for (int i = 2; i * i < 10005; i++)
{
if (prime[i])
{
for (int j = i * 2; j < 10005; j += i)
prime[j] = false;
}
}
}
int bfs(int x, int M)
{
queue<pair<int, int>> q;
// 标记是否已经尝试
bool dp[10005] = {0};
q.push({x, 0});
dp[x] = 1;
while (!q.empty())
{
auto x = q.front();
q.pop();
// 结果
if (x.first == M)
{
return x.second;
}
// 个数
for (int i = 1; i < 10; i += 2)
{
// 改变个位数
int y = (x.first / 10) * 10 + i;
if (prime[y] && dp[y] == 0)
{
dp[y] = 1;
q.push({y, x.second + 1});
}
}
// 十位
for (int i = 0; i < 10; i++)
{
// 改变十位数
int y = (x.first / 100) * 100 + i * 10 + x.first % 10;
if (prime[y] && dp[y] == 0)
{
dp[y] = 1;
q.push({y, x.second + 1});
}
}
// 百位
for (int i = 0; i < 10; i++)
{
// 改变百位数
int y = (x.first / 1000) * 1000 + i * 100 + x.first % 100;
if (prime[y] && dp[y] == 0)
{
dp[y] = 1;
q.push({y, x.second + 1});
}
}
// 千位
for (int i = 1; i < 10; i++)
{
// 改变千位数
int y = (x.first % 1000) + i * 1000;
if (prime[y] && dp[y] == 0)
{
dp[y] = 1;
q.push({y, x.second + 1});
}
}
}
return 0;
}
int main()
{
init();
int N;
cin >> N;
while (N--)
{
int x, y;
cin >> x >> y;
cout << bfs(x, y) << endl;
}
return 0;
}