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.
— 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.
1033The 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.
1733
3733
3739
3779
8779
8179
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탐색을 하면서 연결된 노드를 찾아가는 방법으로 문제를 해결하였다.
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 |