i-09

来源:互联网 发布:淘宝优惠券套现 编辑:程序博客网 时间:2024/05/21 02:02

Description

The ministers of the cabinet were quite upset by the message from the Chief of Security stating that they would all have to change the four-digit room numbers on their offices. 
— It is a matter of security to change such things every now and then, to keep the enemy in the dark. 
— But look, I have chosen my number 1033 for good reasons. I am the Prime minister, you know! 
— I know, so therefore your new number 8179 is also a prime. You will just have to paste four new digits over the four old ones on your office door. 
— No, it’s not that simple. Suppose that I change the first digit to an 8, then the number will read 8033 which is not a prime! 
— I see, being the prime minister you cannot stand having a non-prime number on your door even for a few seconds. 
— Correct! So I must invent a scheme for going from 1033 to 8179 by a path of prime numbers where only one digit is changed from one prime to the next prime. 

Now, the minister of finance, who had been eavesdropping, intervened. 
— No unnecessary expenditure, please! I happen to know that the price of a digit is one pound. 
— Hmm, in that case I need a computer program to minimize the cost. You don't know some very cheap software gurus, do you? 
— In fact, I do. You see, there is this programming contest going on... Help the prime minister to find the cheapest prime path between any two given four-digit primes! The first digit must be nonzero, of course. Here is a solution in the case above. 
1033 
1733 
3733 
3739 
3779 
8779 
8179
The cost of this solution is 6 pounds. Note that the digit 1 which got pasted over in step 2 can not be reused in the last step – a new 1 must be purchased.

Input

One line with a positive number: the number of test cases (at most 100). Then for each test case, one line with two numbers separated by a blank. Both numbers are four-digit primes (without leading zeros).

Output

One line for each case, either with a number stating the minimal cost or containing the word Impossible.

Sample Input

31033 81791373 80171033 1033

Sample Output

670
题意:
四位数,每次改变一位上的数,使其变成素数,直到达到要求,求改变的步数

分析:

用宽搜就行

代码:

[cpp] view plain copy
  1. #include<iostream>  
  2. #include<cstring>  
  3. #include<queue>  
  4. #include<algorithm>  
  5. using namespace std;  
  6. int a[10000],b[10000];  
  7. struct num  
  8. {  
  9.     int s,l;  
  10. };  
  11. void bfs(int n,int m)  
  12. {  
  13.     num v,kk;  
  14.     int i,sum=0,temp;  
  15.     v.s=n;  
  16.     v.l=0;  
  17.     queue<num>gg;  
  18.     gg.push(v);  
  19.     while(!gg.empty())  
  20.     {  
  21.         v=gg.front();  
  22.         if(v.s==m){cout<<v.l<<endl;return ;}  
  23.         gg.pop();  
  24.         for(i=1;i<10;i++)  
  25.         {  
  26.             temp=v.s%1000+i*1000;  
  27.             if(b[temp]==0&&!a[temp])  
  28.             {  
  29.                 kk.s=temp;  
  30.                 kk.l=v.l+1;  
  31.                 b[temp]=1;  
  32.                 gg.push(kk);  
  33.             }  
  34.         }  
  35.         for(i=0;i<10;i++)  
  36.         {  
  37.             temp=v.s/1000*1000+v.s%100+i*100;  
  38.             if(b[temp]==0&&!a[temp])  
  39.             {  
  40.                 kk.s=temp;  
  41.                 kk.l=v.l+1;  
  42.                 b[temp]=1;  
  43.                 gg.push(kk);  
  44.             }  
  45.         }  
  46.         for(i=0;i<10;i++)  
  47.         {  
  48.             temp=v.s/100*100+v.s%10+i*10;  
  49.             if(b[temp]==0&&!a[temp])  
  50.             {  
  51.                 kk.s=temp;  
  52.                 kk.l=v.l+1;  
  53.                 b[temp]=1;  
  54.                 gg.push(kk);  
  55.             }  
  56.         }  
  57.         for(i=0;i<10;i++)  
  58.         {  
  59.             temp=v.s/10*10+i;  
  60.             if(b[temp]==0&&!a[temp])  
  61.             {  
  62.                 kk.s=temp;  
  63.                 kk.l=v.l+1;  
  64.                 b[temp]=1;  
  65.                 gg.push(kk);  
  66.             }  
  67.         }  
  68.     }  
  69.     cout<<"Impossible"<<endl;  
  70.     return;  
  71. }  
  72. int main()  
  73. {  
  74.     int t,k,n,m,i,j;  
  75.     for(i=2;i<10000;i++)  
  76.     {  
  77.         if(a[i]==0)  
  78.         {  
  79.             for(j=i+1;j<10000;j++)  
  80.             {  
  81.                 if(j%i==0)a[j]=1;  
  82.             }  
  83.         }  
  84.     }  
  85.     cin>>t;  
  86.     for(k=0;k<t;k++)  
  87.     {  
  88.         memset(b,0,sizeof(b));  
  89.         cin>>n>>m;  
  90.         bfs(n,m);  
  91.     }  
  92. }  

感受:

挺水的

原创粉丝点击