POJ 3126 Prime Path (bfs+欧拉线性素数筛)
Description
— 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
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
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+欧拉线性素数筛)的更多相关文章
- poj 3126 Prime Path bfs
题目链接:http://poj.org/problem?id=3126 Prime Path Time Limit: 1000MS Memory Limit: 65536K Total Submi ...
- POJ 3126 Prime Path(BFS 数字处理)
意甲冠军 给你两个4位质数a, b 每次你可以改变a个位数,但仍然需要素数的变化 乞讨a有多少次的能力,至少修改成b 基础的bfs 注意数的处理即可了 出队一个数 然后入队全部能够由这个素 ...
- poj 3126 Prime Path( bfs + 素数)
题目:http://poj.org/problem?id=3126 题意:给定两个四位数,求从前一个数变到后一个数最少需要几步,改变的原则是每次只能改变某一位上的一个数,而且每次改变得到的必须是一个素 ...
- POJ 3126 Prime Path bfs, 水题 难度:0
题目 http://poj.org/problem?id=3126 题意 多组数据,每组数据有一个起点四位数s, 要变为终点四位数e, 此处s和e都是大于1000的质数,现在要找一个最短的路径把s变为 ...
- POJ 3126 Prime Path(BFS求“最短路”)
题意:给出两个四位数的素数,按如下规则变换,使得将第一位数变换成第二位数的花费最少,输出最少值,否则输出0. 每次只能变换四位数的其中一位数,使得变换后的数也为素数,每次变换都需要1英镑(即使换上的数 ...
- POJ 3126 Prime Path BFS搜索
题意:就是找最短的四位数素数路径 分析:然后BFS随便搜一下,复杂度最多是所有的四位素数的个数 #include<cstdio> #include<algorithm> #in ...
- POJ 3126 Prime Path (BFS+剪枝)
题目链接:传送门 题意: 给定两个四位数a.b,每次能够改变a的随意一位.而且确保改变后的a是一个素数. 问最少经过多少次改变a能够变成b. 分析: BFS,每次枚举改变的数,有一个剪枝,就是假设这个 ...
- POJ 3126 Prime Path (BFS + 素数筛)
链接 : Here! 思路 : 素数表 + BFS, 对于每个数字来说, 有四个替换位置, 每个替换位置有10种方案(对于最高位只有9种), 因此直接用 BFS 搜索目标状态即可. 搜索的空间也不大. ...
- BFS POJ 3126 Prime Path
题目传送门 /* 题意:从一个数到另外一个数,每次改变一个数字,且每次是素数 BFS:先预处理1000到9999的素数,简单BFS一下.我没输出Impossible都AC,数据有点弱 */ /**** ...
随机推荐
- hdu 2732 Leapin' Lizards (最大流 拆点建图)
Problem Description Your platoon of wandering lizards has entered a strange room in the labyrinth yo ...
- Git中三种文件状态及其转换和git适用命令
- CTF | bugku | 速度要快
检查源码时发现有 <!-- OK ,now you have to post the margin what you find --> 检查响应头发现有 flag: 6LeR55qE6L+ ...
- 神秘的java Https
说起网络安全,最基本的策略就是走https.https仿佛一条神秘通道,有了它,万事无忧. 究竟什么是https?如何实现https? 本文将揭开https的神秘面纱. WTF https 万事皆有源 ...
- jdk8的stream流式计算的操作
jdk8之后增加了流式计算,现在根据学习了流式计算,并把过程记录下来: Person.java的bean package com.zhang.collectordemo; /** * @program ...
- SQL语言分类DDL、DML、DQL、TCL、DCL
关系型数据库的SQL语句都可以分为4大类: 1. DDL(数据定义语言) DDL 主要是指如下的四种SQL 语句,以 CREATE.DROP.ALRET开头和 TRUNCATE TABLE 语 ...
- 关于JAVA的环境变量和那些jar包
大家配置环境变量一般都是 JAVA_HOME:C:\Program Files (x86)\Java\jdk1.6.0_30; PATH:%JAVA_HOME%\bin; CLASSPATH:.;%J ...
- Bootstrap 学习笔记3 路径分页标签和徽章组件
- svn设置文件提交过滤、svn设置classes文件提交
在svn提交文件的时候为了避免一些不必要的文件也提交到资源库 像编译后的.class文件 第一步:在文件中右击打开设置, 第二步:找到全局忽略样式 第三步:修改要过滤的文件 设置过滤通配符 *clas ...
- Codeforces 500B New Year Permutation( Floyd + 贪心 )
B. New Year Permutation time limit per test 2 seconds memory limit per test 256 megabytes input stan ...