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.
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;
	}
}

 

posted @ 2013-09-24 18:46  Al J  阅读(236)  评论(0编辑  收藏  举报