POJ 3126 Prime Path
https://vjudge.net/problem/POJ-3126
题意:T组数据,每组数据给你两个四位数 a 和 b.
每次你可以变幻四位数 a 某个位置上的数字,得到一个新的四位数 t,并且 t 是素数,
问变幻多少次后,可以得到四位数 b.
题解:埃式筛法求素数(暴力求素数应该也可,口嗨)+裸BFS。
#include <iostream>
#include <stdio.h>
#include <cstring>
#include <cmath>
#include <queue>
#include <set>
using namespace std;
const int N = 1e3 + 7;
const int MAXN = 1e5 + 7;
int prime[N]; //存素数
bool vis[MAXN],st[MAXN];
int t,a,b;
struct node
{
int num,step;
};
void isprime(int num) //埃式筛法
{
int idx = 0;
memset(st,false,sizeof(st));
for(int i = 2; i <= num; i++)
{
if(!vis[i]) // i 是素数
{
prime[idx++] = i;
st[i] = true;
}
for(int j = 0; prime[j] <= num/i; j++)
{
vis[prime[j]*i] = true;
if(i%prime[j] == 0) break;
}
}
}
void BFS(int s, int e)
{
set<int>S;
S.insert(s);
node start;
start.num = s, start.step = 0;
queue<node>q;
q.push(start);
while(!q.empty())
{
node now = q.front();
q.pop();
if(now.num == e) //到达终点,输出转换次数
{
printf("%d\n",now.step);
return;
}
for(int i = 0; i < 4; i++)
{
int j = i,wei = 1;
while(j--)
wei *= 10;
int digt = (now.num/wei)%10;
int temp = now.num - digt*wei;
for(int j = 0; j <= 9; j++)
{
if(i == 3 && j == 0) continue; //千位不能是0
int number = temp + wei*j;
if(st[number] && S.find(number) == S.end()) // S.find()查重,没查到会返回 S.end()
{
node Next;
Next.num = number;
Next.step = now.step+1;
q.push(Next);
S.insert(number);
}
}
}
}
S.clear(); //清空
}
int main()
{
scanf("%d",&t);
isprime(9999); //打表
while(t--) //t组数据
{
scanf("%d %d",&a,&b); //起点,终点
BFS(a,b);
}
return 0;
}
永远年轻 永远热泪盈眶!

浙公网安备 33010602011771号