POJ_3126 Prime Path 【BFS+素数打表】
一、题目
http://poj.org/problem?id=3126
二、分析
该题主要是要让我们找到一个$4$位素数到另一个$4$位素数的最少的变换次数,且要求保证每一次变换都满足
1.下一个数必须是4位。
2.下一个数必须是素数。
知道满足这两个条件后,然后结合$BFS$即可求出解。
这里有个处理4位数变换的技巧就是通过一个式子完成。
$next = P\%T[i]+P/T[i+1]*T[i+1]+j*T[i]$
这里的$T$数组为${1, 10, 100, 1000, 10000}$。具体的证明可以自己多画几项就出来了。
三、AC代码
#include <iostream>
#include <cstdio>
#include <cstring>
#include <queue>
#include <cmath> using namespace std;
const int MAXN = 1e5;
bool isPrime[MAXN];
bool visit[MAXN];
const int T[] = {, , , , };
int Start, End;
struct Node
{
int value;
int step;
}; void getPrime()
{
memset(isPrime, , sizeof(isPrime)); isPrime[] = isPrime[] = ;
for(int i = ; i < MAXN; i++)
{
if(isPrime[i])
{
for(int j = i*; j < MAXN; j+=i)
{
isPrime[j] = ;
}
}
}
} int BFS()
{
memset(visit, , sizeof(visit));
Node t;
t.value = Start;
visit[t.value] = ;
t.step = ;
if(t.value == End)
return t.step;
queue<Node> Q;
Q.push(t); while( !Q.empty() )
{
Node p = Q.front();
Q.pop();
t.step = p.step+;
for(int i = ; i < ; i++)
{
int temp, j;
temp = p.value%T[i] + (p.value/T[i+])*T[i+];
if( i == )
j = ;
else
j = ;
for(; j < ; j++)
{
t.value = temp + j*T[i];
if(!visit[t.value] && isPrime[t.value])
{
visit[t.value] = ;
if(t.value == End)
return t.step;
Q.push(t);
}
}
}
}
return -;
} int main()
{
int N, Ans;
getPrime();
scanf("%d", &N);
while(N--)
{
scanf("%d %d", &Start, &End);
Ans = BFS();
printf("%d\n", Ans);
}
return ;
}
POJ_3126 Prime Path 【BFS+素数打表】的更多相关文章
- POJ3126 Prime Path (bfs+素数判断)
POJ3126 Prime Path 一开始想通过终点值双向查找,从最高位开始依次递减或递增,每次找到最接近终点值的素数,后来发现这样找,即使找到,也可能不是最短路径, 而且代码实现起来特别麻烦,后来 ...
- poj 3126 Prime Path( bfs + 素数)
题目:http://poj.org/problem?id=3126 题意:给定两个四位数,求从前一个数变到后一个数最少需要几步,改变的原则是每次只能改变某一位上的一个数,而且每次改变得到的必须是一个素 ...
- POJ 3126 Prime Path (BFS + 素数筛)
链接 : Here! 思路 : 素数表 + BFS, 对于每个数字来说, 有四个替换位置, 每个替换位置有10种方案(对于最高位只有9种), 因此直接用 BFS 搜索目标状态即可. 搜索的空间也不大. ...
- POJ 3126 Prime Path(素数路径)
POJ 3126 Prime Path(素数路径) Time Limit: 1000MS Memory Limit: 65536K Description - 题目描述 The minister ...
- 素数路径Prime Path POJ-3126 素数,BFS
题目链接:Prime Path 题目大意 从一个四位素数m开始,每次只允许变动一位数字使其变成另一个四位素数.求最终把m变成n所需的最少次数. 思路 BFS.搜索的时候,最低位为0,2,4,6,8可以 ...
- POJ 3126:Prime Path(素数+BFS)
The ministers of the cabinet were quite upset by the message from the Chief of Security stating that ...
- CD0J/POJ 851/3126 方老师与素数/Prime Path BFS
Prime Path Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 9982 Accepted: 5724 Descri ...
- POJ2126——Prime Path(BFS)
Prime Path DescriptionThe ministers of the cabinet were quite upset by the message from the Chief of ...
- [HDU 1973]--Prime Path(BFS,素数表)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1973 Prime Path Time Limit: 5000/1000 MS (Java/Others ...
- POJ 3126 Prime Path(BFS 数字处理)
意甲冠军 给你两个4位质数a, b 每次你可以改变a个位数,但仍然需要素数的变化 乞讨a有多少次的能力,至少修改成b 基础的bfs 注意数的处理即可了 出队一个数 然后入队全部能够由这个素 ...
随机推荐
- selenium2 用testNG对百度首页输入框进行测试 (三)
如果还没有安装testNG的亲,可以点击http://www.cnblogs.com/milanmi/p/4346580.html查看安装过程. 这节主要是对百度首页的输入框进行输入测试. packa ...
- 什么是Kali Linux?
什么是Kali Linux? Kali Linux是一个基于Debian的Linux发行版,旨在实现高级渗透测试和安全审计.Kali包含数百种工具,适用于各种信息安全任务,如渗透测试,安全研究,计算机 ...
- css 样式文字溢出显示省略号
在table中使用溢出样式,table样式要设置为”table-layout: fixed“,即<table style="table-layout: fixed;"> ...
- Linux文件系统操作命令
Linux文件系统操作命令 文件系统操作命令: 1. cat:可以显示文件的内容(经常和more搭配使用),或将多个文件合并成一个文件. 2. chgrp:用来改变文件或目录所属的用户组,命令的参数以 ...
- ESP8266-iot-简介1
ESP8266简介
- 通过event事件来控制红绿灯通行车辆
事件的初始值为False,所以最开始就是红灯,先模拟红绿灯的规律,设定为每两秒变换一次灯,然后再模拟车辆通行,通过事件来将两者的事件结合起来, 当事件为False时,为红灯,车辆处于等待状态,一直wa ...
- Java IO流的回顾与梳理(必记必会必写)
- idea无法下载源码(Cannot download sources)
有网上说,在命令行项目根目录下,执行如下命令下载: mvn dependency:resolve -Dclassifier=sources 我试着没有效果. 但是在本地仓库中,找到要下载的目录,删除以 ...
- 编写高质量代码改善C#程序的157个建议——建议61:避免在finally内撰写无效代码
建议61:避免在finally内撰写无效代码 在阐述建议之前,需要先提出一个问题:是否存在一种打破try-finally执行顺序的情况,答案是:不存在(除非应用程序本身因为某些很少出现的特殊情况在tr ...
- JAVA读取控制台的输入【转】
前面介绍了使用IO类实现文件读写的示例,其实在很多地方还需要使用到IO类,这里再以读取控制台输入为例子来介绍IO类的使用. 控制台(Console)指无图形界面的程序,运行时显示或输入数据的位置,前面 ...