poj3126——Prime Path

来源:互联网 发布:企业数据库软件 编辑:程序博客网 时间:2024/06/02 01:58

题目大意:给出两个四位素数,每次改变只能改四位中的一位,问最少经过几次改变能将第一个数变为第二个数

输入:case个数n(最多不超过100个)

           第i个case的两个四位素数(不以0开头)

输出:最少改变次数/impossible

分析:bfs搜索

           先打印素数表,再用队列进行bfs搜索

代码:转载自http://blog.csdn.net/wangjian8006/article/details/7461966

  1. #include <iostream>  
  2. #include <queue>  
  3. using namespace std;  
  4. #define MAXV 10000  
  5.   
  6. bool prime[MAXV];  
  7.   
  8. void init(){    //对素数打表  
  9.     int i,j;  
  10.     for(i=1000;i<=MAXV;i++){  
  11.         for(j=2;j<i;j++)  
  12.             if(i%j==0){  
  13.                 prime[i]=false;  
  14.                 break;  
  15.             }  
  16.         if(j==i) prime[i]=true;  
  17.     }  
  18. }  
  19.   
  20. int bfs(int first,int last){  
  21.     bool dis[MAXV];  
  22.     queue <int>q;  
  23.     int v,i,j,temp,vtemp,count[MAXV],t[4];  
  24.     memset(dis,false,sizeof(dis));  
  25.     memset(count,0,sizeof(count));  
  26.   
  27.     q.push(first);  
  28.     dis[first]=true;  
  29.   
  30.     while(!q.empty()){  
  31.         v=q.front();  
  32.         q.pop();  
  33.   if(v==last) return count[v];  

  34.         t[0]=v/1000;  
  35.         t[1]=v%1000/100;  
  36.         t[2]=v%100/10;  
  37.         t[3]=v%10;  

  38.         for(j=0;j<4;j++){  
  39.             temp=t[j];//把第j位的数字先保存下来  
  40.             for(i=0;i<10;i++)  
  41.                 if(i!=temp){  
  42.                     t[j]=i;  
  43.                     vtemp=t[0]*1000+t[1]*100+t[2]*10+t[3];  
  44.                     if(!dis[vtemp] && prime[vtemp]){  
  45.                         count[vtemp]=count[v]+1;  
  46.                         dis[vtemp]=true;  
  47.                         q.push(vtemp);  
  48.                     }  
  49.                     if(vtemp==last) return count[vtemp];  
  50.                 }  
  51.             t[j]=temp;  
  52.         }  
  53.     }  
  54.     return -1;  
  55. }  
  56.   
  57. int main(){  
  58.     int n,a,b,key;  
  59.     init();  
  60.     scanf("%d",&n);  
  61.     while(n--){  
  62.         scanf("%d%d",&a,&b);  
  63.         key=bfs(a,b);  
  64.         if(key!=-1) printf("%d\n",key);  
  65.         else printf("Impossible\n");  
  66.     }  
  67.     return 0;  

原创粉丝点击