POJ3126Prime Path
http://poj.org/problem?id=3126
题意 : 给你两个四位数,都是素数,一个是初始素数x,一个是目标素数y,让你从x变成y,x每次只能改变1位数,来变成另外一个素数k,再改变k的一位数变成另另外一个素数,这样变下去,找到x变成y需要的最少的次数,如果无法实现,输出Impossible
思路 : 每个数字共有4位数,每位数字有10种可能的改变值[0...9],但最高位不允许为0,所以可以将问题转化为图:初始素数和所有经一位数值改变得到的新素数为节点,若素数a经一位改变后变为素数b,则a连向b一条边长为1的有向边<a,b>,所以若目标素数y在图中,则初始素数到目标素数的路径上的边数即为花费数目,否则无解,如此一来,就转化为x到y的最短路径了,所以使用宽度优先搜索来寻找最短路即可 BFS 。
#include<cstdio>
#include<cstring>
#include<iostream>
using namespace std ;
const int maxn = ;
const int maxm = ;
struct node
{
int k,step ;//当前素数为k,路径长度为step
} h[maxn] ;
int p[maxn] ;
int x,y,n,s[maxn] ;
void prim()
{
memset(p,,sizeof(p));
p[] = p[] = ;
for (int i = ; i <= maxm ; i++)
{
if(!p[i])
{
for(int j = i*i ; j <= maxm ; j += i)
{
p[j] = ;
}
}
}
}
int change(int x,int i,int j)//x的第i位数改为j
{
if(i == ) return(x/)*+j ;//个位数
else if(i == ) return (x/)*+x%+j* ;
else if(i == ) return (x/)*+x%+j* ;
else if(i == ) return (x%)+j* ;
return ;
}
int main()
{
prim() ;//生成[2....9999]之间的素数
cin>>n;//输入测试用例数
while(n--)
{
cin>>x>>y ;//输入初始素数和目标素数
h[].k = x ; //宽度优先搜索,初始素数进入队列
h[].step = ;
int l = ,r = ;//队列首尾指针初始化
memset(s,,sizeof(s)) ;//所有素数的路径长度初始化
int ans = - ;//最小花费初始化
while()
{
if(h[l].k == y)//若达到目标素数,则记下路径长度并退出循环
{
ans = h[l].step ;
break ;
}
int tk,ts ;
for(int i = ; i <= ; i++)//依次改变队首节点的每一位
{
for(int j = ; j <= ; j++)
{
if(!((j == )&&(i == )))//依次枚举第i位的改变值(不允许最高位变为0)
{
tk = change(h[l].k,i,j);//计算队首节点的第i位变为j的数tk
if(p[tk])//若tk为合数,继续枚举
continue;
ts = h[l].step+ ;//计算得到的素数tk的路径长度
if(ts >= s[tk])
continue ;//若路径长度非最短,则继续枚举
if(tk == y)//若tk为目标素数,则记下路径长度并推出循环
{
ans = ts;
break ;
}
s[tk] = ts;//记下到素数tk的路径长度
r++ ;
h[r].k = tk ;//素数tk及其路径长度入队列
h[r].step = ts ;
}
}
}
if(l == r||ans >= )//若队列空或者得到的目标素数,则退出循环
break ;
l++ ;//队首指针+1;
}
if(ans >= )//若得到目标素数,则输出最短路径
cout<<ans<<endl ;
else
cout<<"Impossible"<<endl ;
}
return ;
}
POJ3126Prime Path的更多相关文章
- poj3126--Prime Path(广搜)
Prime Path Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 11751 Accepted: 6673 Descr ...
- POJ-3126-Prime Path(BFS)
Prime Path Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 27852 Accepted: 15204 Desc ...
- poj3126Prime Path (BFS+素数筛)
素数筛:需要一个数组进行标记 最小的素数2,所有是2的倍数的数都是合数,对合数进行标记,然后找大于2的第一个非标记的数(肯定是素数),将其倍数进行标记,如此反复,若是找n以内的所有素数,只需要对[2, ...
- POJ3126Prime Path(BFS)
#include"cstdio" #include"queue" #include"cstring" using namespace std ...
- NodeJs之Path
Path模块 NodeJs提供的Path模块,使得我们可以对文件路径进行简单的操作. API var path = require('path'); var path_str = '\\Users\\ ...
- 【原】实时渲染中常用的几种Rendering Path
[原]实时渲染中常用的几种Rendering Path 本文转载请注明出处 —— polobymulberry-博客园 本文为我的图形学大作业的论文部分,介绍了一些Rendering Path,比较简 ...
- Node.js:path、url、querystring模块
Path模块 该模块提供了对文件或目录路径处理的方法,使用require('path')引用. 1.获取文件路径最后部分basename 使用basename(path[,ext])方法来获取路径的最 ...
- VSCode调试go语言出现:exec: "gcc": executable file not found in %PATH%
1.问题描述 由于安装VS15 Preview 5,搞的系统由重新安装一次:在用vscdoe编译go语言时,出现以下问题: # odbcexec: "gcc": executabl ...
- Leetcode 笔记 113 - Path Sum II
题目链接:Path Sum II | LeetCode OJ Given a binary tree and a sum, find all root-to-leaf paths where each ...
随机推荐
- Linux platform设备简介
Technorati 标签: Linux platform Linux在2.6内核中,针对一系列设备驱动,提供新的管理框架,成为platform机制,推出的目的,在于隔离驱动的资源和实现,使得 ...
- 使用kyototycoon挂载leveldb,映射内存磁盘的使用心得
前段时间在做大数据的KV引擎应用,测试了leveldb的性能,感觉挺好的,美中不足的是他是基于磁盘读写.在我们的场景里,IO频率预计会远远超出磁盘的承受能力,并且太频繁的读取可能也会引发磁盘恶化的速度 ...
- JDK 与 JRE (转)
很多程序员已经干了一段时间java了依然不明白jdk与jre的区别.JDK就是Java Development Kit.简单的说JDK是面向开发人员使用的SDK,它提供了Java的开发环境和运行环境. ...
- c#读写注册表示例分享
c#读写注册表示例,示例中有详细注释. 代码: //写注册表RegistryKey regWrite;//往HKEY_CURRENT_USER主键里的Software子键下写一个名为“Test”的子键 ...
- php实现input输入框失去焦点自动保存输入框的数据
最近做一个输入框失去焦点时自动保存数据的功能,当然就是jQuery选择器选择input,blur时,ajax提交数据给php文件,php文件保存一下数据咯.主要是要注意一下中文的问题,所以中间需要转一 ...
- Maven入门指南⑤:使用Nexus搭建Maven私服
1 . 私服简介 私服是架设在局域网的一种特殊的远程仓库,目的是代理远程仓库及部署第三方构件.有了私服之后,当 Maven 需要下载构件时,直接请求私服,私服上存在则下载到本地仓库:否则,私服请求外部 ...
- .NET开发之窗体间的传值转化操作
DOTNET开发之窗体间的传值转化操作 好想把自己最近学到的知识写下来和各位朋友分享,也希望得到大神的指点.今天终于知道自己要写点什么,就是关于WPF开发时简单的界面传值与简单操作. 涉及两个界面:一 ...
- HTTP 错误 404.3 - Not Found
在使用win2012服务器上的IIS发布网页的时候,出现下面的错误 解决办法: 将应用程序开发下的所有功能都安装. 如果上面的方法没解决问题的话,那么看看下图中的这些安装没,没有的话就继续安装.
- 转载 -- C# 中的委托和事件
原文地址:http://www.tracefact.net/CSharp-Programming/Delegates-and-Events-in-CSharp.aspx C# 中的委托和事件 引言 委 ...
- Javascript中字符串转换成Date的方法
//字符串转成Time(dateDiff)所需方法 function stringToTime(string) { var f = string.split(' ', 2); var d = (f[0 ...