POJ-3126 Prime Path
Posted yanying7
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了POJ-3126 Prime Path相关的知识,希望对你有一定的参考价值。
题目:https://vjudge.net/problem/POJ-3126#author=541607120101
简单bfs,但我用了很笨比的做法。。把每一位数都保存下来然后逐位改值检查并加入队列,直到找到所求值,具体见代码。
1 #include <stdio.h> 2 #include <string.h> 3 #include <math.h> 4 int prime[10000]; 5 int f[10000];//对加入的数做标记 6 int l[10000][2];//模拟队列 7 int n,m,h,r,num; 8 int isprime(int t){//筛素数,但因为本题不允许int与double值比较,所以不用sqrt 9 for(int i=2;i*i<=t;i++){ 10 if(t%i==0)return 0; 11 } 12 return 1; 13 } 14 void bfs(int x){ 15 memset(f,0,sizeof(f));//每次对标记数组和队列清空 16 memset(l,0,sizeof(l)); 17 f[x]=1; 18 h=0; 19 r=1; 20 l[h][0]=x; 21 l[h][1]=0; 22 while(h<r){ 23 int a[5]={0};//保存每一位数 24 int val=l[h][0],i=4; 25 while(val>0){ 26 a[i]=val%10; 27 val/=10; 28 i--; 29 } 30 for(int j=0;j<=9;j++){//从个位起依次改变值 31 int q=a[1]*1000+a[2]*100+a[3]*10+j; 32 if(f[q]==0&&prime[q]){ 33 f[q]=1; 34 l[r][0]=q; 35 l[r][1]=l[h][1]+1; 36 r++; 37 if(q==m){ 38 num=l[h][1]+1; 39 return; 40 } 41 } 42 } 43 for(int j=0;j<=9;j++){ 44 int q=a[1]*1000+a[2]*100+j*10+a[4]; 45 if(f[q]==0&&prime[q]){ 46 f[q]=1; 47 l[r][0]=q; 48 l[r][1]=l[h][1]+1; 49 r++; 50 if(q==m){ 51 num=l[h][1]+1; 52 return; 53 } 54 } 55 } 56 for(int j=0;j<=9;j++){ 57 int q=a[1]*1000+j*100+a[3]*10+a[4]; 58 if(f[q]==0&&prime[q]){ 59 f[q]=1; 60 l[r][0]=q; 61 l[r][1]=l[h][1]+1; 62 r++; 63 if(q==m){ 64 num=l[h][1]+1; 65 return; 66 } 67 } 68 } 69 for(int j=1;j<=9;j++){ 70 int q=j*1000+a[2]*100+a[3]*10+a[4]; 71 if(f[q]==0&&prime[q]){ 72 f[q]=1; 73 l[r][0]=q; 74 l[r][1]=l[h][1]+1; 75 r++; 76 if(q==m){ 77 num=l[h][1]+1; 78 return; 79 } 80 } 81 } 82 h++; 83 } 84 } 85 int main(void){ 86 for(int i=1000;i<=9999;i++){ 87 if(isprime(i))prime[i]=1; 88 } 89 int t; 90 scanf("%d",&t); 91 while(t--){ 92 scanf("%d %d",&n,&m); 93 if(n==m)printf("0 "); 94 else{ 95 num=0; 96 bfs(n); 97 if(num==0)printf("Impossible "); 98 else printf("%d ",num); 99 } 100 } 101 return 0; 102 }
以上是关于POJ-3126 Prime Path的主要内容,如果未能解决你的问题,请参考以下文章