posts - 195,  comments - 30,  trackbacks - 0
#include<iostream>
#include
<queue>
#include
<math.h>
using namespace std;
const int MAX=10000;
int visited[10000];
int result[10000];
bool isprimer(int npp)
 {
     
for (int q = 2; q <= sqrt(double(npp)); ++q)
     {
         
if (npp % q == 0)
         {
             
return 0;
         }
     }
     
return 1;
 
 }

int BFS(int start,int end) 
{
    queue
<int> q;
    
if (start == end)
        
return 0;
    q.push(start);
    visited[start]
=1;
    result[start]
=0;
    
while(!q.empty()) 
    {
        
int temp=q.front();
        q.pop();
        
int next,j,k;
        
int num[3];
        
        
for (int i =0;i<4;++i)
            {    
                 num[
0]=temp%10;
                 num[
1]=(temp%100)/10;
                 num[
2]=(temp%1000)/100;
                 num[
3]=temp/1000;   
                 
for(j=0;j<=9;j++)      
               {                       
                 num[i]
=j;
                 next
=num[0]+num[1]*10+num[2]*100+num[3]*1000;
                 
                 
if((next>1000&&visited[next]!=1)&&isprimer(next))
                 {
                     q.push(next);
                     result[next]
=result[temp]+1;
                     visited[next]
=1;                                             
                 }
                 
if(next==end)
                 {
                   
return result[next];           
                 }
              }     
            } 
    }
    
return MAX;
}
int main() {
    
//freopen("s.txt","r",stdin);
    
//freopen("key.txt","w",stdout);
    int n,k,j,m;
    cin
>>j;
    
while(j--)
    {
    memset(visited,
0,sizeof(visited));
    memset(result,
0,sizeof(result));          
    cin
>>n>>k;
    m
=BFS(n,k);
    
if(m!=MAX)          
    cout
<<m<<endl;
    
else
    cout
<<"Impossible"<<endl;
    }
    
return 0;
}

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

3
1033 8179
1373 8017
1033 1033

Sample Output

6
7
0

代码完全可以优化,比如定义一个结构体可以省掉result数组!
懒得改了
发现poj比joj更惊心动魄啊!经常compling,结果半天才出现!
posted on 2009-05-13 23:32 luis 阅读(691) 评论(2)  编辑 收藏 引用 所属分类: 搜索

FeedBack:
# re: poj 3126 广搜
2009-06-29 15:18 | 等等等
为什么BFS中定义的k明明没有用,删除后答案却不对了呢!!!
不懂啊!!!  回复  更多评论
  
# re: poj 3126 广搜
2009-06-30 10:59 | luis
@等等等
m=BFS(n,k);中的k是有用的,
-----
while(!q.empty())
{
int temp=q.front();
q.pop();
int next,j,k;//这个k没用,我删除后提交还是AC了
int num[3];
-----------  回复  更多评论
  

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理


<2011年11月>
303112345
6789101112
13141516171819
20212223242526
27282930123
45678910

常用链接

留言簿(3)

随笔分类

随笔档案

文章分类

文章档案

友情链接

搜索

  •  

最新评论

阅读排行榜

评论排行榜