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的主要内容,如果未能解决你的问题,请参考以下文章

POJ 3126 Prime Path (BFS)

POJ3126:Prime Path

POJ 3126 Prime Path

POJ-3126 Prime Path

poj-3126 Prime Path

Prime Path POJ-3126