• 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 } 
  • 相关阅读:
    Windows 2003,XP安装Windows Phone 7 狼人:
    Android实例剖析笔记(六) 狼人:
    Android实例剖析笔记(一) 狼人:
    Android NDK带来什么 狼人:
    Windows Phone 7常用资源大集合 狼人:
    Android实例剖析笔记(七) 狼人:
    JDK环境变量配置
    jQuery去掉字符串起始和结尾的空格
    结构型设计模式
    主题:hibernate生成tree(基于注解方式)
  • 原文地址:https://www.cnblogs.com/yanying7/p/12307610.html
Copyright © 2020-2023  润新知