HDOJ-三部曲一(搜索、数学)-1008-Prime Path
Prime Path
Time Limit : 2000/1000ms (Java/Other) Memory Limit : 131072/65536K (Java/Other)
Total Submission(s) : 15 Accepted Submission(s) : 13
Problem 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.
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
Source
PKU
又是一道BFS水题。。。。
#include<iostream> #include<cstring> #include<cmath> using namespace std; bool num[10000]={false},f[10000]; int n1,n2; int que[20000],step[10000],m[10000]; //数组m表示上次变得位数。如果上次变了一位这次还变同一位就没有意义了 void judgeprime() //打标法判断1000到9999各个数是否是素数 { for(int i=1000;i<10000;i++) { for(int j=2;j<=sqrt(i);j++) { if(i%j==0) { num[i]=false; break; } else num[i]=true; } } } int BFS() { int front=0,rear=1; step[front]=0; que[0]=n1; f[n1]=true; if(que[front]==n2) return step[front]; while(front<rear) { int t=que[front]/10*10; //变个位 for(int i=0;i<=9;i++) { if(num[t]&&!f[t]&&m[front]!=1) { que[rear]=t; f[t]=true; m[rear]=1; step[rear]=step[front]+1; if(que[rear]==n2) return step[rear]; rear++; } t++; } t=que[front]/100*100+que[front]%10; //变十位 for(int i=0;i<=9;i++) { if(num[t]&&!f[t]&&m[front]!=2) { que[rear]=t; f[t]=true; m[rear]=2; step[rear]=step[front]+1; if(que[rear]==n2) return step[rear]; rear++; } t+=10; } t=que[front]/1000*1000+que[front]%100; //变百位 for(int i=0;i<=9;i++) { if(num[t]&&!f[t]&&m[front]!=3) { que[rear]=t; f[t]=true; m[rear]=3; step[rear]=step[front]+1; if(que[rear]==n2) return step[ rear]; rear++; } t+=100; } t=1000+que[front]%1000; for(int i=0;i<=8;i++) //变千位 { if(num[t]&&!f[t]&&m[front]!=4) { que[rear]=t; f[t]=true; m[rear]=4; step[rear]=step[front]+1; if(que[rear]==n2) return step[rear]; rear++; } t+=1000; } front++; } } int main() { judgeprime(); int T; cin>>T; /*for(int i=1000;i<10000;i++) if(num[i]) cout<<i<<' ';*/ while(T--) { cin>>n1>>n2; memset(que,0,sizeof(que)); memset(f,false,sizeof(f)); memset(step,0,sizeof(step)); memset(m,0,sizeof(m)); cout<<BFS()<<endl; } }