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. OC 内存管理机制总结

    OC 内存管理机制总结 一:OC内存管理机制目前分为两块,其一自动内存管理机制,其二手动内存管理机制: 1.首先我们从自动内存管理机制讲起: 1)什么是自动内存管理机制,自动内存管理机制就是程序中所创 ...

  2. Win8 URI 方案 ms-appX 用法大全

    ms-appdata://可以引用来自应用的本地.漫游和临时数据文件夹中的应用文件ms-appdata:///local/hello/logo.png ms-appx://可以引用来自应用包的应用文件 ...

  3. Windows Phone 8仿Toast弹出通知。

    Wp8后台收到消息可以弹出Toast通知,可是应用在前台跑的时候却好像没有办法弹出Toast通知.而需求上有要求要弹出Toast通知,在这种情况下,就开始考虑是否能够做一个类似Toast的弹出通知呢? ...

  4. Android AdapterView.OnItemSelectedListener

    AdapterView.OnItemSelectedListener Summary Public Methods abstract void onItemSelected(AdapterView&l ...

  5. 基础学习总结(八)--HttpClient

    在Android开发中,Android SDK附带了Apache的HttpClient,它是一个完善的客户端.它提供了对HTTP协议的全面支持,可以使用HttpClient的对象来执行HTTP GET ...

  6. CENTOS6.2系统日志rsyslog替换默认的日志服务syslog 转载自http://www.phpboy.net/linux/648.html

    最近遇到配置centos 6.2的sshd及sftp日志,发现/etc/syslog.conf文件不存在, 然后: #rpm -qa | grep syslog 出来的是 rsyslog-5.8.10 ...

  7. Oracle利用数据泵迁移用户

    一.利用数据泵将数据导出 1.1.确定字符集: select * from v$nls_parameters; 或 select userenv('language') from dual; 1.2. ...

  8. C# 刷票程序

    上个月有人让我帮忙投票,我想要不写个程序给他多刷点得了,虽然这事情有悖原则,就当娱乐了.. 先上图 1.分析 既然是网页投票,那肯定可以伪造HTTP请求来实现刷票.需要分析的就是该网站到底采用了哪些防 ...

  9. Microsoft Virtual Academy 介绍

    Microsoft Virtual Academy 是微软的虚拟学院,会推出微软各个方面的一些教程 介绍一点有用的链接 http://www.microsoftvirtualacademy.com/e ...

  10. OSGI容器与插件

    插件必须符合osgi规范才能插到osgi容器中,osgi容器查看插件jar中MANIFEST.MF中osgi容器. 所谓插件----就是打包好的jar文件,  内部都封装好了一些功能