其他分享
首页 > 其他分享> > POJ - 3126 Prime Path

POJ - 3126 Prime Path

作者:互联网

题目链接: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;
}


 

Dayline. 发布了2 篇原创文章 · 获赞 0 · 访问量 44 私信 关注

标签:Prime,prime,digit,int,3126,number,POJ,1033,now
来源: https://blog.csdn.net/qq_45811601/article/details/104106708