POJ 3126 Prime Path (BFS)__搜尋

來源:互聯網
上載者:User
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.

1033173337333739377987798179

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


題意

給你n,m分別是素數,求由n到m變化的步驟數,規定每一步只能改變個十百千一位的數(千位不能為零),且變化得到的每一個數也為素數。


思路

首先進行素數打表,打出10000以內的所有素數(或者1000-10000),然後bfs。

對n變化個十百千的每一位,變化後檢測是否為素數,若是,排入佇列,同時標記已訪問,然後對隊列中的數進行同樣的操作,直到某一次變化產生m,輸出最少的變換次數。

若不可能達到m,則會在遍曆完[1000-9999]之間所有素數後退出。


AC 代碼

#include<iostream>#include<algorithm>#include<stdio.h>#include<string.h>#include<math.h>#include<iostream>using namespace std;#include<vector>#include<queue>#define Max 10000int prime[Max];bool isvis[Max];    //已經訪問過的數字不需要重新排入佇列void IsPrime()      //素數打表{    prime[0]=prime[1]=0;    prime[2]=1;    for(int i=3; i<Max; i++)        prime[i]=i%2==0?0:1;    int t=(int)sqrt(Max*1.0);    for(int i=3; i<=t; i++)        if(prime[i])            for(int j=i*i; j<Max; j+=2*i) //最佳化                prime[j]=0;}struct point{    int data;    int time;   //當前進行到第幾步    point(int data,int time)    {        this->data=data;        this->time=time;    }};int solve(point a,int b){    memset(isvis,false,sizeof(isvis));    queue<point>sk;    sk.push(a);    while(!sk.empty())    {        point p=sk.front();        sk.pop();        if(p.data==b)return p.time;        isvis[p.data]=true;        for(int i=10; i<=10000; i*=10)  //從低到高枚舉        {            for(int j=(i==10000)?1:0; j<=9; j++)    //最高位不能是0            {                int num=p.data/i*i+i/10*j+p.data%(i/10);    //計算當前的數字                if(!isvis[num]&&prime[num])                    sk.push(point(num,p.time+1));            }        }    }    return -1;}int main(){    IsPrime();    int n;    while(~scanf("%d",&n))    {        int a,b;        for(int i=0; i<n; i++)        {            scanf("%d%d",&a,&b);            int ans=solve(point(a,0),b);            printf(ans==-1?"Impossible\n":"%d\n",ans);        }    }    return 0;}

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.