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的更多相关文章

  1. poj3126--Prime Path(广搜)

    Prime Path Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 11751   Accepted: 6673 Descr ...

  2. POJ-3126-Prime Path(BFS)

    Prime Path Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 27852   Accepted: 15204 Desc ...

  3. poj3126Prime Path (BFS+素数筛)

    素数筛:需要一个数组进行标记 最小的素数2,所有是2的倍数的数都是合数,对合数进行标记,然后找大于2的第一个非标记的数(肯定是素数),将其倍数进行标记,如此反复,若是找n以内的所有素数,只需要对[2, ...

  4. POJ3126Prime Path(BFS)

    #include"cstdio" #include"queue" #include"cstring" using namespace std ...

  5. NodeJs之Path

    Path模块 NodeJs提供的Path模块,使得我们可以对文件路径进行简单的操作. API var path = require('path'); var path_str = '\\Users\\ ...

  6. 【原】实时渲染中常用的几种Rendering Path

    [原]实时渲染中常用的几种Rendering Path 本文转载请注明出处 —— polobymulberry-博客园 本文为我的图形学大作业的论文部分,介绍了一些Rendering Path,比较简 ...

  7. Node.js:path、url、querystring模块

    Path模块 该模块提供了对文件或目录路径处理的方法,使用require('path')引用. 1.获取文件路径最后部分basename 使用basename(path[,ext])方法来获取路径的最 ...

  8. VSCode调试go语言出现:exec: "gcc": executable file not found in %PATH%

    1.问题描述 由于安装VS15 Preview 5,搞的系统由重新安装一次:在用vscdoe编译go语言时,出现以下问题: # odbcexec: "gcc": executabl ...

  9. 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 ...

随机推荐

  1. 【风马一族_Android】Android 从命令行界面获取手机信息

    Android 从命令行界面获取手机信息 1: cmd 打开命令行界面 2:adb devices   获取与电脑相连的设备,例如:模拟器.真机(手机) (右击“标记”,选择设备名称,点击“Ctrl+ ...

  2. 【Qt】Qt之设置QWidget背景色【转】

    简述 QWidget是所有用户界面对象的基类,这意味着可以用同样的方法为其它子类控件改变背景颜色. Qt中窗口背景的设置,下面介绍三种方法. 使用QPalette 使用Style Sheet 绘图事件 ...

  3. Microsoft AzureStorageAccount for Powershell

    使用Powershell 创建的存储账户,注意StorageAccountName只能使用小写字母以及数字, -Location参考http://www.cnblogs.com/SignalTips/ ...

  4. android连接本地tomcat服务器,报timeout

    1.在eclipse环境下连接时,没有任何问题 2.直接将服务端发布到tomcat服务下,报timeout 3.查明原因: 3.1打开IE访问,一切正常,可以获取到数据,说明不是服务端的问题 3.2打 ...

  5. ORA-00845

    系统版本: [root@yoon ~]# more /etc/oracle-releaseOracle Linux Server release 5.7 数据库版本: Oracle Database ...

  6. WPF中的Style

    一.Style基础知识 构成Style最重要的两种元素是Setter和Trigger Setter类帮助我们设置控件的静态外观风格 Trigger类帮助我们设置控件的行为风格 Setter类的Prop ...

  7. WPF-控件-ControlTemplate生成的控件

    <Window x:Class="由ControlTemplate生成的控件.MainWindow" xmlns="http://schemas.microsoft ...

  8. CustomEditor 自定义预览窗

    using UnityEngine; using System.Collections; public class MyTextureView : MonoBehaviour { public Tex ...

  9. 2016 系统设计第一期 (档案一)MVC bootstrap model弹出子页面

    通过bootstrap  弹出modal-dialog 子页面 ,例如我要弹出子页面:areaitem_sub_One.html. 具体步骤如下: 第一步:新建 areaitem_sub_One.ht ...

  10. Cocos2dx 截屏

    void SaveScreenshot() { CCSize size = CCDirector::sharedDirector()->getWinSize(); CCRenderTexture ...