码迷,mamicode.com
首页 > 其他好文 > 详细

POJ-3126 Prime Path

时间:2020-02-14 16:38:49      阅读:95      评论:0      收藏:0      [点我收藏+]

标签:int   入队   code   amp   ble   http   for   math   但我   

题目: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\n");
 94         else{
 95             num=0;
 96             bfs(n);
 97             if(num==0)printf("Impossible\n");
 98             else printf("%d\n",num);
 99         }
100     }
101     return 0; 
102 } 

 

POJ-3126 Prime Path

标签:int   入队   code   amp   ble   http   for   math   但我   

原文地址:https://www.cnblogs.com/yanying7/p/12307610.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!