Light OJ 1141--BFS--(隐蔽的BFS)

来源:互联网 发布:linux jenkins svn 编辑:程序博客网 时间:2024/06/08 07:12

题意:求数字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;    }}}


0 0
原创粉丝点击