Prime Path
题面翻译
给你个整数 \(T(T\leq 100)\),接下来 \(T\) 行数据。
每次给你俩数 \(a,b\)(保证都是四位数且都为无前导零的质数),问 \(a\) 经过几次变换可以变成 \(b\)。输出最少可以经过几次变换变成 \(b\) 的次数。如果变不成直接输出 Impossible
。
规定 \(a\) 可以变成 \(c\) 当且仅当 \(a,c\) 都为质数,且只改变 \(a\) 其中的一位。
例如:\(1033\to8179\),有一种方法是:\(1033\to1733\to3733\to3739\to3779\to8779\to8179\),最少变换了 \(6\) 次。
题目描述
输入格式
输出格式
样例 #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;
}
标签:Prime,10,int,质数,UVA12101,new,Path,1033,first
From: https://www.cnblogs.com/j1hx-oi/p/18064274