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 题意给你两个4位素数a b,让你将a每次改变一位数字,改变后的4位数还必须是素数,最少几步能变到b,输出步数,不能变到输出Impossible。
这题第一发T了...一看就是果然T,忘了加vis2这个数组标记那些数组被访问过了...不加的话因为队列及时pop了,会出现在两个素数之间来回跳的情况!
小插曲就是欧拉线性素数筛,自己还没背会2333333。
代码如下:
 #include <iostream>
#include <cstdio>
#include <queue>
#include <algorithm>
#include <cstring>
using namespace std;
#define inf 0x3f3f3f3f
int prime[],a,b,ans;
bool num[],vis[],vis2[];
bool flag;
int dig[];
struct node
{
int x,stp;
};
void split (int x)//将x分成各个位
{
for (int i=;i<;++i)
{
dig[i]=x%;
x/=;
}
}
int getnum (int a,int b,int c,int d)//将4个数字组成一个四位数
{
return a+b*+c*+d*;
}
void getprime()//欧拉线性素数筛
{
memset(num,false,sizeof num);
memset(vis,false,sizeof vis);
memset(prime,,sizeof prime);
int cnt=;
for (int i=;i<;++i)
{
if (!vis[i])
prime[cnt++]=i,num[i]=;
for (int j=;j<cnt&&i*prime[j]<;++j)
{
vis[i*prime[j]]=;
if (i%prime[j]==)
break;
}
}
}
void bfs(node now)
{
queue<node>q;
q.push(now);
vis2[now.x]=true;
if (now.x==b)
{
flag=true;
ans=now.stp;
return ;
}
while (!q.empty())
{
node frt=q.front();
q.pop();
if (frt.x==b)
{
flag=true;
ans=frt.stp;
return ;
}
split(frt.x);
for (int i=;i<=;++i)//改个位
{
int temp=getnum(i,dig[],dig[],dig[]);
if (temp==frt.x)
continue;
if (num[temp]&&!vis2[temp])
{
node tp;
tp.x=temp;
tp.stp=frt.stp+;
vis2[temp]=true;
q.push(tp);
}
}
for (int i=;i<=;++i)//改十位
{
int temp=getnum(dig[],i,dig[],dig[]);
if (temp==frt.x)
continue;
if (num[temp]&&!vis2[temp])
{
node tp;
tp.x=temp;
tp.stp=frt.stp+;
vis2[temp]=true;
q.push(tp);
}
}
for (int i=;i<=;++i)//改百位
{
int temp=getnum(dig[],dig[],i,dig[]);
if (temp==frt.x)
continue;
if (num[temp]&&!vis2[temp])
{
node tp;
tp.x=temp;
tp.stp=frt.stp+;
vis2[temp]=true;
q.push(tp);
}
}
for (int i=;i<=;++i)//改千位,注意是4位数,所以千位不为0,从一开始
{
int temp=getnum(dig[],dig[],dig[],i);
if (temp==frt.x)
continue;
if (num[temp]&&!vis2[temp])
{
node tp;
tp.x=temp;
tp.stp=frt.stp+;
vis2[temp]=true;
q.push(tp);
}
}
}
return ;
}
int main()
{
getprime();
//freopen("de.txt","r",stdin);
int t;
scanf("%d",&t);
while (t--)
{
scanf("%d%d",&a,&b);
memset(vis2,false,sizeof vis2);
ans=inf;
node now;
now.x=a,now.stp=;
bfs(now);
if (flag)
printf("%d\n",ans);
else
printf("Impossible\n");
}
return ;
}

POJ 3126 Prime Path (bfs+欧拉线性素数筛)的更多相关文章

  1. poj 3126 Prime Path bfs

    题目链接:http://poj.org/problem?id=3126 Prime Path Time Limit: 1000MS   Memory Limit: 65536K Total Submi ...

  2. POJ 3126 Prime Path(BFS 数字处理)

    意甲冠军  给你两个4位质数a, b  每次你可以改变a个位数,但仍然需要素数的变化  乞讨a有多少次的能力,至少修改成b 基础的bfs  注意数的处理即可了  出队一个数  然后入队全部能够由这个素 ...

  3. poj 3126 Prime Path( bfs + 素数)

    题目:http://poj.org/problem?id=3126 题意:给定两个四位数,求从前一个数变到后一个数最少需要几步,改变的原则是每次只能改变某一位上的一个数,而且每次改变得到的必须是一个素 ...

  4. POJ 3126 Prime Path bfs, 水题 难度:0

    题目 http://poj.org/problem?id=3126 题意 多组数据,每组数据有一个起点四位数s, 要变为终点四位数e, 此处s和e都是大于1000的质数,现在要找一个最短的路径把s变为 ...

  5. POJ 3126 Prime Path(BFS求“最短路”)

    题意:给出两个四位数的素数,按如下规则变换,使得将第一位数变换成第二位数的花费最少,输出最少值,否则输出0. 每次只能变换四位数的其中一位数,使得变换后的数也为素数,每次变换都需要1英镑(即使换上的数 ...

  6. POJ 3126 Prime Path BFS搜索

    题意:就是找最短的四位数素数路径 分析:然后BFS随便搜一下,复杂度最多是所有的四位素数的个数 #include<cstdio> #include<algorithm> #in ...

  7. POJ 3126 Prime Path (BFS+剪枝)

    题目链接:传送门 题意: 给定两个四位数a.b,每次能够改变a的随意一位.而且确保改变后的a是一个素数. 问最少经过多少次改变a能够变成b. 分析: BFS,每次枚举改变的数,有一个剪枝,就是假设这个 ...

  8. POJ 3126 Prime Path (BFS + 素数筛)

    链接 : Here! 思路 : 素数表 + BFS, 对于每个数字来说, 有四个替换位置, 每个替换位置有10种方案(对于最高位只有9种), 因此直接用 BFS 搜索目标状态即可. 搜索的空间也不大. ...

  9. BFS POJ 3126 Prime Path

    题目传送门 /* 题意:从一个数到另外一个数,每次改变一个数字,且每次是素数 BFS:先预处理1000到9999的素数,简单BFS一下.我没输出Impossible都AC,数据有点弱 */ /**** ...

随机推荐

  1. 【HDOJ6609】Find the answer(线段树)

    题意:给定一个n个正整数的数列,第i项为w[i],对于每个i,你要从[1,i-1]中选择一些变成0,使得变化后[1,i]的总和小于m,每次询问最少要变几个 n<=2e5,m<=1e9,1& ...

  2. 洛谷 4099 [HEOI2013]SAO——树形DP

    题目:https://www.luogu.org/problemnew/show/P4099 结果还是看了题解才会…… 关键是状态,f[ i ][ j ] 表示 i 子树. i 号点是第 j 个出现的 ...

  3. AcWing 244. 谜一样的牛 (树状数组+二分)打卡

    题目:https://www.acwing.com/problem/content/245/ 题意:有n只牛,现在他们按一种顺序排好,现在知道每只牛前面有几只牛比自己低,牛的身高是1-n,现在求每只牛 ...

  4. mysql联合查询sql优化

    我们在使用mysql数据库时,经常会使用到mysql的联合查询,联合查询分为内连接和外连接,内连接查询结果是联合的表都存在匹配才会有结果,外连接则根据驱动表是否存在匹配来生成结果集. 这里使用mysq ...

  5. c++文件拷贝

    #include<fstream>void Copyfile( char* FileSource, char* FileItem ){fstream fsCopee( FileSource ...

  6. 12. I2C-EEPROM

    12.1. I2C 协议简介 I 2 C ( Inter-Integrated Circuit )协议是由 Phiilps 公司开发的,由于它具引脚少,硬件实现简单,可扩展性强,不需要如 USART. ...

  7. Php单元测试 phpunit & codecept

    phpunit: Windows版本 整体上说,在 Windows 下安装 PHAR 和手工在 Windows 下安装 Composer 是一样的过程: 下载链接:http://pan.baidu.c ...

  8. MVC和WebApi 使用get和post 传递参数。 转载https://blog.csdn.net/qq373591361/article/details/51508806

    版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/qq373591361/article/details/51508806我们总结一下用js请求服务器的 ...

  9. jmeter工作原理介绍,以及常见错误

    JMeter结果树响应数据中文乱码解决办法 打开jmeter配置文件搜索encoding修改编码格式改为utf-8 Jmeter服务器反馈登陆不成功问题 导入到JMeter后,执行场景,发现登录校验成 ...

  10. FastReport.net 使用 Winform WebForm打印

    delphi用的fastreport比较多 所以.net中也研究一下用法,这个打印控件还是很简单的 只要手动设计一下写少许代码就可以打印了 甚至可以写成通用代码 以后就可以不用写代码 安装demo会同 ...