【例1】整数变换(POJ 3278 “Catch That Cow”)

给定两个整数a和b(0 ≤a,b≤100,000),要求把a变换到b。变换规则为:(1)当前数加1;(2)当前数减1;(3)当前数加倍。

编写程序求从a到b最少需要的变换次数。

例如,从5变换到17,最少需要4歩,具体过程为:5-10-9-18-17。

(1)编程思路。

用数组que[100001]模拟队列,队头指针front和队尾指针rear的初始值均为0。

定义数组visit[100001]标记某数是否产生并记录该数产生所需的最少变换步数。初始时,所有元素值均为-1,visit[i]=-1表示整数i未变换出来,visit[i]=n表示整数i从初始数开始经过n次变换得到。

为体会visit数组的作用,我们以整数5开始变换为例说明。由于5是初始数,所以置visit[5]=0。

由于按3种变换规则,5可以变换为4,6和10,因此置visit[4]=visit[6]=visit[10]=visit[5]+1=1,即4、6和10这3个数通过1次变换得到;4可以变换为3、5(visit[5]!=-1,已访问过不再处理)和8,因此置visit[3]=visit[8]=visit[4]+1=2,即3和8可以通过2次变换得到。……

(2)源程序。

#include <iostream>

using namespace std;

int main()

{

int a, b,front,rear,t,i;

int que[100001]={0},visit[100001];

cin>>a>>b;

for (i=0;i<=100000;i++)

visit[i]=-1;

front = 0, rear = 0;

que[rear++] = a;     // 初始元素a 入队

visit[a] = 0;

while (front != rear)

{

t = que[front++];

if (t == b)

{

cout<<visit[t]<<endl;

break;

}

if (t > 0 && visit[t-1]==-1)

{

visit[t-1] = visit[t]+1;

que[rear++] = t-1;

}

if (t < 100000 && visit[t+1]==-1)

{

visit[t+1] = visit[t]+1;

que[rear++] = t+1;

}

if (t <= 50000 && visit[t*2]==-1)

{

visit[t*2] = visit[t]+1;

que[rear++] = t*2;

}

}

return 0;

}

【例2】质数变换(POJ 3126 “Prime Path”)

给定两个四位质数a和b,要求把a变换到b。变换的过程要求:(1)每次变换出来的数都是一个四位质数;(2)每一步变换所得的质数与前一步得到的质数只能有一个位不同。

编写程序求从a到b最少需要的变换次数,无法变换则输出Impossible。

例如,从1033变换到8179最少需要6歩,具体变换过程为1033、1733、3733、3739、3779、8779、8179。

(1)编程思路。

定义数组char prime[10000];来进行质数的判断,prime[x]=‘1’表示整数x是质数,prime[x]=‘0’表示整数x不是质数。采用筛法构建质数判定表prime[10000]。

在整数x进行变换时,可分别对x的千位、百位、十位和个位进行 (可用循环for (i=0;i<4;i++) 处理),每位上可由0~9这10种选择(可用循环 for (j=0;j<10;j++)处理)。即数的变换可以采用一个二重循环处理。若变换出的整数num如果是一个4位数(num>=1000),且没有访问过(visit[num]=-1),还是质数(prime[num]='1'),则将产生的整数num入队。

(2)源程序及运行结果。

#include <iostream>

using namespace std;

char prime[10000];

void GetPrime()              // 用筛法构建质数判定表

{

int i,j;

for (i=2;i<10000;i++)

prime[i]='1';

for(i=2;i<10000;i++)

{

if (prime[i]=='1')

for (j=2*i;j<10000;j+=i)

prime[j]='0';

}

prime[1]='0';

}

void BFS(int k,int m)

{

int visit[10000],que[10000],a[4]={1,10,100,1000};

int front,rear,i,j,s,x,y,num;

for (i=1000;i<10000;i++)

visit[i]=-1;

front=rear=0;

que[rear++]=k;              // k入队

visit[k]=0;

while(front!=rear)

{

s=que[front++];         // 队头元素出队

if (s==m)

{

cout<<visit[s]<<endl;

return;

}

for (i=0;i<4;i++)

{

for (j=0;j<10;j++)

{

x=s/(a[i]*10);

y=s%a[i];

num=x*a[i]*10+j*a[i]+y;

if (num>1000 && visit[num]==-1 && prime[num]=='1')

{

que[rear++]=num;     // 变换后的质数入队

visit[num]=visit[s]+1;

}

}

}

}

cout<<"Impossible"<<endl;

}

int main()

{

int n,k,m;

GetPrime();

cin>>n;

while (n--)

{

cin>>k>>m;

BFS(k,m);

}

return 0;

}

BFS(二):数的变换的更多相关文章

  1. 二维DCT变换 | Python实现

    引言 最近专业课在学信息隐藏与数字水印,上到了变换域隐藏技术,提到了其中的DCT变换,遂布置了一个巨烦人的作业,让手动给两个\(8\times8\)的矩阵做二维DCT变换,在苦逼的算了一小时后,我决定 ...

  2. 二维DCT变换

    DCT(Discrete Consine Transform),又叫离散余弦变换,它的第二种类型,经常用于信号和图像数据的压缩.经过DCT变换后的数据能量非常集中,一般只有左上角的数值是非零的,也就是 ...

  3. 【Nowcoder 上海五校赛】二数(模拟)

    题目描述: 我们把十进制下每一位都是偶数的数字叫做“二数”. 小埃表示自己很聪明,最近他不仅能够从小数到大:2,3,4,5....,也学会了从大数到小:100,99,98...,他想知道从一个数开始数 ...

  4. 双向BFS—>NOIP2002 字串变换

    如果目标也已知的话,用双向BFS能很大提高速度 单向时,是 b^len的扩展. 双向的话,2*b^(len/2)  快了很多,特别是分支因子b较大时 至于实现上,网上有些做法是用两个队列,交替节点搜索 ...

  5. NOIP2002 字串变换

    题二 字串变换 (存盘名: NOIPG2) [问题描述]: 已知有两个字串 A$, B$ 及一组字串变换的规则(至多6个规则): A1$ -> B1$ A2$ -> B2$ 规则的含义为: ...

  6. POJ 3216 Prime Path(打表+bfs)

    Prime Path Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 27132   Accepted: 14861 Desc ...

  7. Hough变换原理

    Hough变换原理 一.简单介绍 Hough变换是图像处理中从图像中识别几何形状的基本方法之一.Hough变换的基本原理在于利用点与线的对偶性,将原始图像空间的给定的曲线通过曲线表达形式变为参数空间的 ...

  8. 为什么要进行傅立叶变换?傅立叶变换究竟有何意义?如何用Matlab实现快速傅立叶变换

    写在最前面:本文是我阅读了多篇相关文章后对它们进行分析重组整合而得,绝大部分内容非我所原创.在此向多位原创作者致敬!!!一.傅立叶变换的由来关于傅立叶变换,无论是书本还是在网上可以很容易找到关于傅立叶 ...

  9. 【OpenGL】法线变换详解(Normal Transform)[转]

    http://blog.csdn.net/xiajun07061225/article/details/7762711 在图形学中,同样的一个模型视图变换矩阵可以用来变换点.线.多边形以及其它几何体, ...

随机推荐

  1. java堆 (转)

     Java栈和堆 ----这两个概念未知很长一段时间,终于找到了一个很好的文本.使用和共享 1. 堆(stack)堆(heap)他们是Java使用Ram本地存储的数据. 与C++不同,Java主动管理 ...

  2. Rust 2017 调查报告:学习曲线是最大痛点(最大的问题是这门语言太偏底层了,现在做底层的少了。还有C这个绕不过去的存在)

    Rust 官方在社区上做了一次调查,以了解用户如何看待 Rust 的发展.调查共收到 5368 份回复,其中有 大约 2/3 的是 Rust 用户,剩下的 1/3 是非 Rust 用户,调查结果如下. ...

  3. 编写可移植C/C++程序的要点(12条)

    1.分层设计,隔离平台相关的代码.就像可测试性一样,可移植性也要从设计抓起.一般来说,最上层和最下层都不具有良好的可移植性.最上层是GUI,大多数GUI都不是跨平台的,如Win32 SDK和MFC.最 ...

  4. POJ3723 Conscription 【并检查集合】

    Conscription Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 8071   Accepted: 2810 Desc ...

  5. NetCore 上传,断点续传,可支持流上传

    之前公司要做一个断点续传的业务,找了许多都没有找到合适的,都是残次不全的,终于让我遇到一个基于百度的 webuploader 的断点续传.原作者: 断点续传(上传)( https://www.some ...

  6. Delphi 10.2可以开发Linux桌面应用了

    原始地址 https://community.embarcadero.com/blogs/entry/firemonkey-on-linux    Delphi Linux编译器已经发布,现在无需等待 ...

  7. java设计模式(2)

    工厂模式定义 在面向对象程序设计中,工厂通常是用来创建其他对象的对象,工产模式根据不同的参数来实现不同的分配方案和创建对象. 在工产模式中,我们创建对象时不会对客户端暴露创建逻辑,而且是通过使用一个共 ...

  8. ArcGIS for Desktop入门教程_第一章_引言 - ArcGIS知乎-新一代ArcGIS问答社区

    原文:ArcGIS for Desktop入门教程_第一章_引言 - ArcGIS知乎-新一代ArcGIS问答社区 1 引言 1.1 读者定位 我们假设用户在阅读本指南前应已具备以下知识: · 熟悉W ...

  9. 三种方式配置Mac OS X的启动项

    在Mac OS X中,有三种方式来实现启动项的配置:1)Login Items:2)StartupItems:3)launchd daemon. 1.Login Items 打开System Pref ...

  10. ORACLE 错误 ora-01830 解决方法

    http://www.cnblogs.com/BetterWF/archive/2012/06/20/2556442.html 错误产生原因:date类型不能包含秒以后的精度. 如日期:2012-06 ...