Poj 3216 Prime Path
来源:互联网 发布:双胞胎 双飞 知乎 编辑:程序博客网 时间:2024/04/29 20:23
Prime Path
Time Limit: 1000MS Memory Limit: 65536KTotal Submissions: 15126 Accepted: 8519
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.
Sample Input
31033 81791373 80171033 1033
Sample Output
670
Source
Northwestern Europe 2006
题目大意:通过不停替换一位数字,并且替换完之后的数字为素数,求从给定数字到达另外给定数字的最小次数(最小数字代价,其实就是最小的次数,因为每次的数字都要重新购买).
思路:素数打表+BFS
AC 代码如下:注意只能用g++提交,用c++提交会RE,暂时不知道为什么,还望有知道的好心人告知。
#include <iostream>#include <cstring>#include <cstdio>#include <cmath>#include <queue>using namespace std;const int maxn=10000+5;int pp[maxn];void getPrim(){ memset(pp,0,sizeof(pp)); pp[0]=pp[1]=1; for(int i=2;i<=sqrt(1.0*maxn);i++) if(!pp[i]) for(int j=i*i;j<=maxn;j+=i) pp[j]=1;}struct pt{ char x[5]; int cnt;};queue<pt> Q;void mysearch(int a,int b){ pt ta,tb; int sign[maxn]; memset(sign,0,sizeof(sign)); while(!Q.empty()) Q.pop(); char x1[5], x2[5]; char tmp[5]; sprintf(x1,"%d",a); sprintf(x2,"%d",b); strcpy(ta.x,x1); ta.cnt=0; Q.push(ta); while(!Q.empty()){ tb=Q.front(); //cout<<"tb"<<" "<<tb.x<<endl; Q.pop(); if(strcmp(tb.x,x2)==0){ printf("%d\n",tb.cnt); break; } for(int i=0;i<4;i++){ for(int j=0;j<=9;j++){ if(tb.x[i]==j+'0') continue; if(j==0 && i==0) continue; ta=tb; ta.x[i]=j+'0'; // cout<<ta.x<<endl; sscanf(ta.x,"%d",&a); ta.cnt=tb.cnt+1; //cout<<a<<endl; if(!pp[a] &&!sign[a]){ sign[a]=1; Q.push(ta); } } } }}int main(){ getPrim(); int n; int a,b; scanf("%d",&n); while(n--){ scanf("%d%d",&a,&b); if(a==b) printf("0\n"); else{ mysearch(a,b); } } return 0;}
0 0
- Poj 3216 Prime Path
- POJ 3216 Prime Path(数字BFS)
- POJ 3126 Prime Path
- POJ 3126 Prime Path
- poj 3126Prime Path
- POJ -3126-Prime Path
- POJ 3126 Prime Path
- poj 3126 Prime Path
- POJ 3126 - Prime Path
- POJ 3126 Prime Path
- poj 3126 prime path
- POJ 3126 Prime Path
- Prime Path poj 3126
- POJ 3126 Prime Path
- poj 3126 Prime Path
- POJ 3126 Prime Path
- poj 3126 Prime path
- poj - 3126 - Prime Path
- 7.Which two statements are true regarding the USING and ON clauses in table joins? (Choose two.)
- UVALive 7344 I - Numbered Cards
- Hive 中的 Join 问题
- ASCII-转义字符
- 从QProcess说开来
- Poj 3216 Prime Path
- 亚马逊AWS和阿里云的员工数量和单兵营收能力几何
- 刷新页面更换CSS样式表-对网上document.write方式的修正
- shell编程基础
- ios 更多 Url Schemes
- unity3d 简单的xml文件读写操作
- android shape的使用
- eclipse出现箭头之类的特殊字符
- Makefile经典教程(掌握这些足够)