寒假前刷题(6)广度优先搜索 poj 3126
2012-12-11 22:19
176 查看
Prime Path
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
Sample Output
#include<math.h>
#include<queue>
#include<stdio.h>
#include<string.h>
using namespace std;
int a,b;
int p[999999]={0};//存放答案的数组
int visit[999999]={0};//标记数组,标记是否被访问
bool isprime(int x)
{
int i;
for(i=2;i<=sqrt((double)x);i++)
{
if(x%i==0)
return false;
}
return true;
}
int bfs(int s,int r)
{
queue<int> q;
q.push(s);
p[s]=0;
visit[s]=1;
while(!q.empty())
{
int temp=q.front();
q.pop();
for(int i=0;i<=9;i++)
{
int y1=(temp/10)*10+i; //得到个位数
if(isprime(y1)&&!visit[y1])
{
q.push(y1);
visit[y1]=1;
p[y1]=p[temp]+1;
}
int y2=temp%10+(temp/100)*100+i*10;//得到十位数
if(isprime(y2)&&!visit[y2])
{
q.push(y2);
visit[y2]=1;
p[y2]=p[temp]+1;
}
int y3=temp%100+(temp/1000)*1000+i*100;//得到百位数
if(isprime(y3)&&!visit[y3])
{
q.push(y3);
visit[y3]=1;
p[y3]=p[temp]+1;
}
if(i!=0)//这一点一开始我也没注意到,记住如果i==0的话,那么无法分离出最高位。
{
int y4=temp%1000+i*1000;
if(isprime(y4)&&!visit[y4])
{
q.push(y4);
visit[y4]=1;
p[y4]=p[temp]+1;
}
}
}
if(visit[r])
return p[r];
}
return 0;
}
int main()
{
int T;
scanf("%d",&T);
while(T--)
{
memset(visit,0,sizeof(visit));
memset(p,0,sizeof(p));
scanf("%d %d",&a,&b);
printf("%d\n",bfs(a,b));
}
return 0;
}
Time Limit: 1000MS | Memory Limit: 65536K | |
Total Submissions: 8097 | Accepted: 4610 |
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
//这是一道典型的搜索题,题目的大意是通过每次变换一个数,使得最终能够达到目标的数,每次变换的数都只能是素数,而且变换的过程中数与数之间之能有一个数字不同,这题首先得素数的判定法,比如数m要为素数,则从2到√m,都不能被m整除。其次就是依次把m的每个位的数分离出来,然后进行变换。借鉴了别人的解题报告,所以大神请绕道。
#include<math.h>
#include<queue>
#include<stdio.h>
#include<string.h>
using namespace std;
int a,b;
int p[999999]={0};//存放答案的数组
int visit[999999]={0};//标记数组,标记是否被访问
bool isprime(int x)
{
int i;
for(i=2;i<=sqrt((double)x);i++)
{
if(x%i==0)
return false;
}
return true;
}
int bfs(int s,int r)
{
queue<int> q;
q.push(s);
p[s]=0;
visit[s]=1;
while(!q.empty())
{
int temp=q.front();
q.pop();
for(int i=0;i<=9;i++)
{
int y1=(temp/10)*10+i; //得到个位数
if(isprime(y1)&&!visit[y1])
{
q.push(y1);
visit[y1]=1;
p[y1]=p[temp]+1;
}
int y2=temp%10+(temp/100)*100+i*10;//得到十位数
if(isprime(y2)&&!visit[y2])
{
q.push(y2);
visit[y2]=1;
p[y2]=p[temp]+1;
}
int y3=temp%100+(temp/1000)*1000+i*100;//得到百位数
if(isprime(y3)&&!visit[y3])
{
q.push(y3);
visit[y3]=1;
p[y3]=p[temp]+1;
}
if(i!=0)//这一点一开始我也没注意到,记住如果i==0的话,那么无法分离出最高位。
{
int y4=temp%1000+i*1000;
if(isprime(y4)&&!visit[y4])
{
q.push(y4);
visit[y4]=1;
p[y4]=p[temp]+1;
}
}
}
if(visit[r])
return p[r];
}
return 0;
}
int main()
{
int T;
scanf("%d",&T);
while(T--)
{
memset(visit,0,sizeof(visit));
memset(p,0,sizeof(p));
scanf("%d %d",&a,&b);
printf("%d\n",bfs(a,b));
}
return 0;
}
相关文章推荐
- Prime Path - POJ 3126 BFS宽度(广度)优先搜索
- POJ 3126-Prime Path-广度优先搜索bfs
- POJ 3278 Catch that cow 广度优先搜索bfs
- 广度优先搜索--抓住那头牛(poj 3278)
- POJ 3278-Catch That Cow 广度优先搜索BFS
- 广度优先搜索--POJ迷宫问题
- POJ 3126广度搜索BFS
- poj 3984 迷宫问题 BFS 图的广度优先搜索
- 【算法入门】广度/宽度优先搜索(BFS)
- C++广度优先搜索算法之Dungeon Master
- 树的存储结构和图的存储结构以及图的深度优先DFS搜索和BFS广度优先搜索
- 深度优先搜索和广度优先搜索
- 数据结构实验之图论一:基于邻接矩阵的广度优先搜索遍历
- 图的广度优先搜索来求从一个城市到另一个城市的路径及其所经过城市最少
- 学习双向广度优先搜索之前的临时感想;
- 广度优先搜索-抓住那头牛(算法基础 第8周)
- 深度优先搜索遍历与广度优先搜索遍历
- 广度优先搜索_基于邻接矩阵
- 深度优先搜索和广度优先搜索的比较与分析
- 图的遍历之 深度优先搜索和广度优先搜索