题意:求数字A变换到B 的最小步数。变换方法是每次加A的素因数
分析:BFS
代码:
#include<iostream>
#include<cstdio>
#include<cstring>
#include<queue>
using namespace std;
int s,t,n,vis[1009],prim[1009],fac[1009];
struct h{
int x,tot;
};
queue<h> q;
int cnt;
void check()//素数筛
{
cnt=0;
memset(vis,0,sizeof(vis));
for(int i=2;i<1000;i++){
if(!vis[i]){
prim[cnt++]=i;
for(int j=2;j*i<1000;j++)
vis[j*i]=1;
}
}
}
int bfs()
{
while(!q.empty()){
int x=q.front().x;
int tot=q.front().tot;
q.pop();
cnt=0;
for(int i=0;prim[i]<x;i++){
if(x%prim[i]==0) fac[cnt++]=prim[i];
}
for(int i=0;i<cnt;i++){
h tmp;
tmp.x=x+fac[i];
if(tmp.x>0&&tmp.x<=t&&!vis[tmp.x]){
if(tmp.x==t) return tot+1;
tmp.tot=tot+1;
vis[tmp.x]=1;
q.push(tmp);
}
}
}
return -1;
}
int main()
{
check();
cin>>n;
for(int i=1;i<=n;i++){
while(!q.empty()) q.pop();
memset(vis,0,sizeof(vis));
cin>>s>>t;
if(s==t) cout<<"Case "<<i<<": 0"<<endl;
else{
h tmp;
tmp.x=s,tmp.tot=0;
vis[s]=1;
q.push(tmp);
int ans=bfs();
cout<<"Case "<<i<<": "<<ans<<endl;
}
}
}