Appoint description:
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
— 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
— No, it’s not that simple. Suppose that I change the first digit to an 8, then the number will
r
ead 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
— 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
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
— 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
1733
3733
3739
3779
8779
8179
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
题意:
给定两个四位素数a b,要求把a变换到b
a只能变 个 、十 、百、 千 上的一位数 ,并且是素数 。
问要最少经过多少次变换到b ,如不能输出Impossible
比如1033变到8179最少需要6次,过程如下
1033
1733
3733
3739
3779
8779
8179
#include
#include
#include
#include
#include
using namespace std; int a[10000],n,m; int fun(int num) ///判断素数 { if(num%2==0) return 0; for(int i=3; i<=sqrt(num); i+=2) { if(num%i==0) return 0; } return 1; } struct node { int tep,x; ///tep 步数 x值 }; queue
Q; int bfs() { int i; node ff,dd; while(!Q.empty())Q.pop(); ff.x=n; ff.tep=0; Q.push(ff); while(!Q.empty()) { dd=ff=Q.front(); Q.pop(); dd.tep++; for(i=0;i<=9;i++) //个 { dd.x=ff.x/10 * 10+i; if(dd.x==m) return dd.tep; if(a[dd.x]==0&&fun(dd.x)) ///判重复+素数 { Q.push(dd); a[dd.x]=1; ///标记 } } for(i=0;i<=9;i++) //十 { dd.x=ff.x/100*100+i*10+ff.x%10; if(dd.x==m) return dd.tep; if(a[dd.x]==0&&fun(dd.x)) ///判重复+素数 { Q.push(dd); a[dd.x]=1; ///标记 } } for(i=0;i<=9;i++) //百 { dd.x=ff.x%100+ff.x/1000*1000+i*100; if(dd.x==m) return dd.tep; if(a[dd.x]==0&&fun(dd.x)) ///判重复+素数 { Q.push(dd); a[dd.x]=1; ///标记 } } for(i=1;i<=9;i++) //千 从1到9 { dd.x=ff.x%1000+i*1000; if(dd.x==m) return dd.tep; if(a[dd.x]==0&&fun(dd.x)) ///判重复+素数 { Q.push(dd); a[dd.x]=1; ///标记 } } } return 0; } int main() { int t; scanf("%d",&t); while(t--) { scanf("%d%d",&n,&m); if(n==m) { printf("0\n"); continue; } memset(a,0,sizeof(a)); a[n]=1; int ans=bfs(); if(ans==0) printf("Impossible\n"); else printf("%d\n",ans); } return 0; }