본문 바로가기

problem solving/Problem Solving

Prime Path

http://acm.pku.edu.cn/JudgeOnline/problem?id=3126

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.


Solving

네자리의 소수가 두개가 주어진다. 첫번째 소수에서 디지트를 하나씩 바꾸면서 두번째 소수를 만드려고 할 때 몇 번의 과정이 필요한가? 중간과정에서 생성되는 숫자 역시 소수여야 한다

우선은 네자리의 소수를 모두 구한다. 소수를 구하는 방법에는 여러가지가 있지만 이 문제처럼 여러 소수를 한 번에 모두 구해야 하는 경우에는 에라토스테네스의 채를 이용하여 구하는 것이 효율적이다.

소수를 모두 구했다면 이제 이 문제를 그래프에서의 최단거리 문제로 해석할 수 있다. 한 소수에서 디지트를 하나 바꿔서 다른 소수를 만들 수 있다면 이 두 소수 사이에는 연결성이 있는 것으로 생각하여 소수들 사이의 관계를 그래프로 나타낼 수 있다.
그래프에서 최단거리 문제의 경우 Floyd를 이용하여 전쌍최단경로를 구할 수 도 있지만 문제에서 요구하는 것은 한 정점에서 다른 정점으로의 최단거리만을 구하면 되기 때문에 다익스트라를 이용하여 구하는 것이 좀 더 알맞은 해법이 될 수 있다. 하지만 다익스트라를 하려면 그래프를 모두 구성 한 후 알고리즘을 수행해야한다.(이는 floyd의 경우도 마찬가지이다)

아래의 코드는 그래프를 모두 구성할 필요 없이 BFS탐색을 하면서 연결된 노드를 찾아가는 방법으로 문제를 해결하였다.

'problem solving > Problem Solving' 카테고리의 다른 글

Sum of Factorials  (0) 2008.10.07
Crazy tea party  (0) 2008.10.07
Ugly Number  (0) 2008.10.06
Subsequence  (0) 2008.10.02
Center of symmetry  (0) 2008.10.02