题意:求数字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; } } }
原文地址:http://blog.csdn.net/ac_0_summer/article/details/44891733