Prime Path
Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 5801 Accepted: 3330 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.
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
8179Input
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 1033Sample Output
6 7 0AC代码1:时间耗费较大
#include <iostream> #include <queue> using namespace std; #define SIZE 10000 int prim[SIZE]; int dist[SIZE]; int visit[SIZE]; int primSize; void prime() { int i,j; bool mark = false; int temp[SIZE]; memset(temp, 0,sizeof(temp)); primSize = 0; for ( i = 2; i < SIZE; i++ ) { if ( !temp[i] ){ for ( j = 2; j*i < SIZE; j++ ) temp[j*i] = -1; if ( i > 1000 ) prim[++primSize] = i; } } } bool isAdjacent( int curr, int next ) { int change = 0; if ( curr%10 == next%10 ) change++; if ( (curr/10)%10 == (next/10)%10 ) change++; if ( (curr/100)%10 == (next/100)%10 ) change++; if ( curr/1000 == next/1000 ) change++; return change == 3; } int bfs( int start, int end ) { queue<int> Q; int i,v; bool isFind = false; memset(visit,0,sizeof(visit)); memset(dist,0,sizeof(dist)); dist[start] = 0; visit[start] = 1; Q.push(start); while( !Q.empty() ) { v = Q.front(); Q.pop(); for (i = 1; i <= primSize && !isFind; i++ ) { if( !visit[prim[i]] ) { if ( isAdjacent(prim[i], v) ) { dist[prim[i]] = dist[v] + 1; visit[prim[i]] = 1; Q.push(prim[i]); if ( prim[i] == end ) isFind = true; } } } } if ( !dist[end] ) return -1; else return dist[end]; } int main() { int n,first,second,ans; prime(); cin >> n; while( n-- ) { cin >> first >> second; if ( first == second ) { cout << "0" << endl; continue; } ans = bfs( first, second ); if ( ans < 0 ) cout << "Impossible" << endl; else cout << ans << endl; } return 0; }
AC代码2:改后 0ms AC#include <iostream> #include <queue> using namespace std; #define SIZE 10000 int prim[SIZE]; int dist[SIZE]; bool visit[SIZE]; void prime() { int i,j; memset(prim,0,sizeof(prim)); for ( i = 2; i < SIZE; i++ ) { if ( !prim[i] ){ for ( j = 2; j*i < SIZE; j++ ) prim[j*i] = 1; } } } int bfs( int start, int end ) { queue<int> Q; int i,j,v,temp; bool isFind = false; memset(visit,false,sizeof(visit)); memset(dist,0,sizeof(dist)); dist[start] = 0; visit[start] = true; Q.push(start); while( !Q.empty() ) { v = Q.front(); Q.pop(); char curr[4]; sprintf(curr,"%d",v); for ( i = 0; i < 4 && !isFind; i++ ) { for ( j = 0; j < 10 && !isFind; j++ ) { if ( !i && !j ) continue; else if ( i == 0 ) temp = 1000*j+100*(curr[1]-'0')+10*(curr[2]-'0')+(curr[3]-'0'); else if ( i == 1 ) temp = 1000*(curr[0]-'0')+100*j+10*(curr[2]-'0')+(curr[3]-'0'); else if ( i == 2 ) temp = 1000*(curr[0]-'0')+100*(curr[1]-'0')+10*j+(curr[3]-'0'); else temp = 1000*(curr[0]-'0')+100*(curr[1]-'0')+10*(curr[2]-'0')+j; if ( !visit[temp] && !prim[temp] ) { dist[temp] = dist[v] + 1; visit[temp] = true; Q.push(temp); if ( temp == end ) isFind = true; } } } } if ( !dist[end] ) return -1; else return dist[end]; } int main() { int n,first,second,ans; prime(); cin >> n; while( n-- ) { cin >> first >> second; if ( first == second ) { cout << "0" << endl; continue; } ans = bfs( first, second ); if ( ans < 0 ) cout << "Impossible" << endl; else cout << ans << endl; } return 0; }
05-07
05-07
“相关推荐”对你有帮助么?
-
非常没帮助
-
没帮助
-
一般
-
有帮助
-
非常有帮助
提交