UVA12101 Prime Path

Prime Path

link

题面翻译

给你个整数 T(T100),接下来 T 行数据。

每次给你俩数 a,b(保证都是四位数且都为无前导零的质数),问 a 经过几次变换可以变成 b。输出最少可以经过几次变换变成 b 的次数。如果变不成直接输出 Impossible

规定 a 可以变成 c 当且仅当 a,c 都为质数,且只改变 a 其中的一位。

例如:10338179,有一种方法是:1033173337333739377987798179,最少变换了 6 次。

题目描述

PDF

输入格式

输出格式

样例 #1

样例输入 #1

3
1033 8179
1373 8017
1033 1033

样例输出 #1

6
7
0

思路

由题意,可得题目大致分为两部分:质数筛和BFS.

然后就套模版就行了,一个比较水的BFS模版题。

代码实现

#include<bits/stdc++.h>
using namespace std;
vector<int> p;
bool not_prime[10005];
bool v[10002];
int ans=0;
int n,m;
int k[5];
void pri(int k)
{
for(int i=2;i<=k;i++)
{
if(!not_prime[i])
{
p.push_back(i);
}
for(int _pri:p)
{
if(i*_pri>k) break;
not_prime[i*_pri]=true;
if(i%_pri==0) break;
}
}
}
void into(int x)
{
memset(k,0,sizeof(k));
k[1]=x/1000;
k[2]=x/100%10;
k[3]=x/10%10;
k[4]=x%10;
}
int outto()
{
return k[1]*1000+k[2]*100+k[3]*10+k[4];
}
void bfs()
{
memset(v,false,sizeof(v));
queue<pair<int,int>> q;
pair<int,int> p;
p.first=n,p.second=0;
q.push(p);
v[n]=true;
while(!q.empty())
{
int x=q.front().first,y=q.front().second;
q.pop();
if(x==m)
{
cout<<y<<endl;
return ;
}
into(x);
for(int i=1;i<=4;i++)
{
for(int j=0;j<=9;j++)
{
if(i==1&&j==0)
{
continue;
}
int t=k[i];
k[i]=j;
pair<int,int> _new;
_new.first=outto();
_new.second=y+1;
if(!v[_new.first]&&!not_prime[_new.first])
{
v[_new.first]=true;
q.push(_new);
}
k[i]=t;
}
}
}
cout<<"Impossible."<<endl;
}
int main()
{
ios::sync_with_stdio(false);
memset(not_prime,0,sizeof(not_prime));
pri(10000);
int t;
cin>>t;
while(t--)
{
cin>>n>>m;
bfs();
}
return 0;
}
posted @   j1hx  阅读(11)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
· 25岁的心里话
点击右上角即可分享
微信分享提示