POJ 3126 Prime Path(素数打表+BFS)

来源:互联网 发布:什么是软件过程模型 编辑:程序博客网 时间:2024/06/11 19:54

题目链接:http://poj.org/problem?id=3126

题意:一个起点数,一个终点数,每次变换只能变换数的其中一位,并且只能是素数,问最少经过几次变换。

题解:最短路径BFS,素数预处理打表。注意第一位不能为0.

代码:

#include<iostream>#include<cstdio>#include<cstring>#include<algorithm>#include<queue>using namespace std;const int MAX=10000+10;const int INF=0x3f3f3f3f;int prim[MAX];int d[MAX];int a,b;int ans;void init(){memset(prim,0,sizeof(prim));for(int i=2;i<MAX;i++){if(!prim[i])for(int j=i*i;j<MAX;j+=i)prim[j]=1;}/*for(int i=1000;i<10000;i++){if(!prim[i]) cout<<i<<endl;}*/}int main(){//freopen("in.txt","r",stdin);//freopen("out.txt","w",stdout);init();int t;scanf("%d",&t);while(t--){queue<int> que;memset(d,0x3f,sizeof(d));scanf("%d%d",&a,&b);que.push(a);d[a]=0;while(!que.empty()){int top=que.front();que.pop();if(top==b){printf("%d\n",d[top]);}int tmp=1;for(int i=0;i<4;i++){int w=(top/tmp)%10;for(int j=w;j>0;j--){int na=top-j*tmp;if(!prim[na]&&d[na]==INF&&na>=1000){que.push(na);d[na]=d[top]+1;}}for(int j=w+1;j<=9;j++){int na=top+(j-w)*tmp;if(!prim[na]&&d[na]==INF&&na>=1000){que.push(na);d[na]=d[top]+1;}}tmp*=10;}}}return 0;}


0 0
原创粉丝点击