hdu3126 Prime Path

来源:互联网 发布:淘宝卖音乐是什么类目 编辑:程序博客网 时间:2024/09/21 09:19

http://poj.org/problem?id=3126

题目大意:就是说给你两个素数,让你每次可以改变第一个素数的某一位数,而且这个新的数也必须是素数,问经过多少次这样的变形,可以得到开始给出的第二个素数。

思路:

一开始以为是数论的题目,后来才发现是搜索,对素数打表,然后每次都搜索素数表就行

#include<iostream>#include<stdio.h>#include<string.h>#include<math.h>#include<queue>using namespace std;int st[10005],v[10005];int cnt[10005];int t[5];void prim(){int i,j;st[0]=1;st[1]=1;for (i=2;i<10000;i++){if(st[i]==0)for (j=i*2;j<10000;j+=i){st[j]=1;}}}int bfs(int now,int last){int i,j,tmp,xx;int cur,next;memset(cnt,0,sizeof(cnt));queue<int>q;q.push(now);while(!q.empty()){cur=q.front();q.pop();//printf("%d %d\n",cur.num,last);if(cur==last)return cnt[cur];t[0]=cur/1000;t[1]=cur/100%10;t[2]=cur/10%10;t[3]=cur%10;//printf("%d %d %d %d %d\n",cur,t[0],t[1],t[2],t[3]);for(i=0;i<4;i++){tmp=t[i];for(j=0;j<10;j++){if(tmp!=j){t[i]=j;xx=t[0]*1000+t[1]*100+t[2]*10+t[3];if(!v[xx]&&st[xx]==0){v[xx]=1;cnt[xx]=cnt[cur]+1;//printf("%d %d\n",xx,next.step);q.push(xx);}if(xx==last)return cnt[xx];}t[i]=tmp;}}}return -1;}int main(){int i,j,x,y,n;memset(st,0,sizeof(st));prim();for(i=0;i<1000;i++)st[i]=1;scanf("%d",&n);while(n--){memset(v,0,sizeof(v));scanf("%d%d",&x,&y);v[x]=1;int ans=bfs(x,y);if(ans!=-1)printf("%d\n",ans);else{printf("Impossible\n");}}}

0 0