一道宽搜题。
不难,可当作素数筛 、队列和结构体的入门训练吧。
提醒:队首元素的标记和删除。
#include <cstdio>
#include <cstring>
#include <queue>
#include <cmath>
using namespace std;
const int MAX = 10000;
struct Node
{
int num;
int step;
Node (int num, int step=0)
{
this->num = num;
this->step = step;
}
};
queue<Node> q;
int last[MAX];
void get_primes(int prime[], int &prime_count)
{
bool visit[MAX+2];
memset(visit, 0, sizeof(visit));
prime_count = 0;
for (int i = 2; i < MAX; i++)
{
if (!visit[i])
{
if (i > 1000)prime[prime_count++] = i;
for (int j = i+i; j < MAX; j += i) visit[j] = true;
}
}
}
bool mere_one_dif(int x, int y)
{
int dif_cnt = 0;
int digit_x;
int digit_y;
while (x && y)
{
digit_x = x % 10;
x /= 10;
digit_y = y % 10;
y /= 10;
if (digit_x != digit_y) dif_cnt++;
}
return (dif_cnt == 1);
}
int main()
{
// prime numbers
int prime[1100];
int prime_count;
get_primes(prime, prime_count);
// input
bool chosen[MAX+2];
int T;
scanf("%d", &T);
while (T--)
{
// clear
while (!q.empty()) q.pop();
memset(chosen, 0, sizeof(chosen));
// input
int begin;
int aim;
scanf("%d%d", &begin, &aim);
q.push(Node(begin, 0));
chosen[begin] = true;
while (!q.empty())
{
Node head = q.front();
q.pop();
if (head.num == aim)
{
printf("%d\n", head.step);
break;
}
for (int i = 0; i < prime_count; i++)
{
if (!chosen[prime[i]] && mere_one_dif(head.num, prime[i]))
{
chosen[prime[i]] = true;
q.push(Node(prime[i], head.step+1));
}
}
}
}
return 0;
}