POJ3126Prime_Path

Prime Path
Time Limit: 1000MS   Memory Limit: 65536K
Total Submissions: 13020   Accepted: 7364

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


package 素數;

import java.util.LinkedList;
import java.util.Queue;
import java.util.Scanner;

import javax.swing.text.ChangedCharSetException;
class Node
{
	public int x, p;
	public Node(int x, int p) {
		this.x = x;
		this.p = p;
	}
}
public class POJ3126Prime_Path {

	static boolean prime[] = new boolean[10000];
	static int t, s, e;
	static int pay[] = new int[10000];
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Scanner cin = new Scanner(System.in);
		setPrime();
		t = cin.nextInt();
		while((t--)!=0)
		{
			s = cin.nextInt();
			e = cin.nextInt();
			spfa(s);
			System.out.println(pay[e]);
		}
	}
	private static void spfa(int s) {
		
		
        Queue<Node> q = new LinkedList<Node>();  
        Node a , b;
        int i, k, p;
        for(i=1000; i<10000; i++)pay[i] = 100000;
        a = new Node(s, 0);
        pay[a.x] = a.p;
        q.add(a);
        while((a = q.poll())!=null)
        { 
        	p = a.p + 1;
        	//System.out.println(a.x + " ** " + a.p);
        	for(i=0; i<=9; i++)
        	{
        		for(int j=1; j<=4; j++)
        		{
        			 k = Change(a.x, i, j);
            		 if(prime[k] && pay[k] > p)
            		 {
            			 pay[k] = p;
            			 b = new Node(k, p);
            			 q.add(b);
            		 }
        		}
        	}
        }
	}
	private static int Change(int x, int i, int c) {
		if(c==1)
		{
			if(i==0)return x;
			return x%1000 + i*1000; 
		}else if(c==2)
		{
			int b = (x%1000)/100;
			return x - b*100 + i*100;
		}else if(c==3)
		{
			int b = (x/10)%10;
			return x - b*10 + i*10;
		}else if(c==4)
		{
			int b= x%10;
			return x - b + i;
		}
		return 0;
	}
	private static void setPrime() {
		// TODO Auto-generated method stub
		for(int i=0; i<10000; i++)prime[i] = true;
		prime[0] = prime[1] = false;
		for(int i=2; i<10000; i++)
		{
			if(prime[i])
			{
				for(int j=i*2; j<10000; j+=i)
				{
					prime[j] = false;
				}
			}
		}
	}

}




發佈了77 篇原創文章 · 獲贊 3 · 訪問量 3萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章