题目链接:T_T
题目:Prime Path
Time Limit: 1000MS
Memory Limit: 65536K
Total Submissions: 37219
Accepted: 19924*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 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
8179The 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).OutputOne 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
Northwestern Europe 2006
题意:
有两个素数a b,求a变成b需要几步,每次只能变一个数,变完一个数以后的数也是素数。
思路:
这个题emm也是广搜的,因为最近做的都是广搜: )本来想用笔算一下这个的,但是放弃了不太会算:)最初想法是四个数字分开讨论,个十百千依次变化,个十百千顺序不重要,表达式对就成。然后变一个判断一下是不是素数,如果是素数,就标记+步数增加+入队。真的是卡到我想哭的一个题。。死的原因也很emm,最开始是在全局变量定义了i(循环用),然后在判断素数函数和bfs函数里都用了它,感觉这样好像比较省事,结果三个样例除了a=b的死活输不进去,emm黑人问号脸。然后在很久很久以后,气的实在没辙了重新敲了一遍,这一次i分别定义的,就莫名奇妙对了???本来我还以为是bfs的问题。。结果两个代码对了很久很久。。才发现是这个i的问题。佛了。8好意思,我一定不懒了。
AC代码:
#include<stdio.h>
#include<queue>
#include<string.h>
using namespace std;
struct node
{
int bushu;
int weizhi;
}start,now,next; //start好像没用emm
int visit[100005];
int s;
bool isPrime( int x )
{
int i;
for(i=2;i<x;i++)
if(x%i==0)
return false;
return true;
}
void bfs(int a,int b)
{
int i;
memset(visit,0,sizeof(visit));
now.bushu=0;
now.weizhi=a;
visit[a]=1;
queue<node>Q;
Q.push(now);
while(!Q.empty())
{
now=Q.front();
Q.pop();
if(now.weizhi==b)
{
printf("%d\n",now.bushu);
return ;
}
for(i=1;i<=9;i++) //千位
{
s=i*1000+now.weizhi%1000;
if(s!=now.weizhi&&!visit[s]&&isPrime(s))
{
visit[s]=1;
next.weizhi=s;
next.bushu=now.bushu+1;
Q.push(next);
}
}
for(i=0;i<=9;i++) //百位
{
s=now.weizhi/1000*1000+i*100+now.weizhi%100;
if(s!=now.weizhi&&!visit[s]&&isPrime(s))
{
visit[s]=1;
next.weizhi=s;
next.bushu=now.bushu+1;
Q.push(next);
}
}
for(i=0;i<=9;i++) //十位
{
s=now.weizhi/100*100+i*10+now.weizhi%10;
if(s!=now.weizhi&&!visit[s]&&isPrime(s))
{
visit[s]=1;
next.weizhi=s;
next.bushu=now.bushu+1;
Q.push(next);
}
}
for(i=0;i<=9;i++) //个位
{
s=now.weizhi/10*10+i;
if(s!=now.weizhi&&!visit[s]&&isPrime(s))
{
visit[s]=1;
next.weizhi=s;
next.bushu=now.bushu+1;
Q.push(next);
}
}
}
printf("Impossible\n");
return ;
}
int main()
{
int a,b;
int n;
scanf("%d",&n);
while(n--)
{
scanf("%d %d",&a,&b);
bfs(a,b);
}
return 0;
}