BFS(二):数的变换
【例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(二):数的变换的更多相关文章
- 二维DCT变换 | Python实现
引言 最近专业课在学信息隐藏与数字水印,上到了变换域隐藏技术,提到了其中的DCT变换,遂布置了一个巨烦人的作业,让手动给两个\(8\times8\)的矩阵做二维DCT变换,在苦逼的算了一小时后,我决定 ...
- 二维DCT变换
DCT(Discrete Consine Transform),又叫离散余弦变换,它的第二种类型,经常用于信号和图像数据的压缩.经过DCT变换后的数据能量非常集中,一般只有左上角的数值是非零的,也就是 ...
- 【Nowcoder 上海五校赛】二数(模拟)
题目描述: 我们把十进制下每一位都是偶数的数字叫做“二数”. 小埃表示自己很聪明,最近他不仅能够从小数到大:2,3,4,5....,也学会了从大数到小:100,99,98...,他想知道从一个数开始数 ...
- 双向BFS—>NOIP2002 字串变换
如果目标也已知的话,用双向BFS能很大提高速度 单向时,是 b^len的扩展. 双向的话,2*b^(len/2) 快了很多,特别是分支因子b较大时 至于实现上,网上有些做法是用两个队列,交替节点搜索 ...
- NOIP2002 字串变换
题二 字串变换 (存盘名: NOIPG2) [问题描述]: 已知有两个字串 A$, B$ 及一组字串变换的规则(至多6个规则): A1$ -> B1$ A2$ -> B2$ 规则的含义为: ...
- POJ 3216 Prime Path(打表+bfs)
Prime Path Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 27132 Accepted: 14861 Desc ...
- Hough变换原理
Hough变换原理 一.简单介绍 Hough变换是图像处理中从图像中识别几何形状的基本方法之一.Hough变换的基本原理在于利用点与线的对偶性,将原始图像空间的给定的曲线通过曲线表达形式变为参数空间的 ...
- 为什么要进行傅立叶变换?傅立叶变换究竟有何意义?如何用Matlab实现快速傅立叶变换
写在最前面:本文是我阅读了多篇相关文章后对它们进行分析重组整合而得,绝大部分内容非我所原创.在此向多位原创作者致敬!!!一.傅立叶变换的由来关于傅立叶变换,无论是书本还是在网上可以很容易找到关于傅立叶 ...
- 【OpenGL】法线变换详解(Normal Transform)[转]
http://blog.csdn.net/xiajun07061225/article/details/7762711 在图形学中,同样的一个模型视图变换矩阵可以用来变换点.线.多边形以及其它几何体, ...
随机推荐
- 对std::string和std::wstring区别的解释,807个赞同,有例子
807down vote string? wstring? std::string is a basic_string templated on a char, and std::wstring on ...
- flash导出正常清晰(无色差)GIF图片
前言: 这枚GIF算是半临摹作品.我使用的FLASH制作这个小动画,其实这类型的动画用AE做会更便捷. 进入主题前,先摆出个成品 教程结束,以上就是flash制作出来的小动画怎么导出正常清晰(无色差) ...
- WPF ListView 居中显示
原文:WPF ListView 居中显示 今天遇到的问题: 方法1:设置GridViewColumn的ActualWidth <ListView > <ListView.View&g ...
- WPF特效-实现3D足球效果
原文:WPF特效-实现3D足球效果 WPF 实现 3D足球效果,效果图如下: 每个面加载不同贴图. <UserControl x:Class="MediaBalll.Model3Ds ...
- VisualSVN-5.1.5补丁原创发布
VisualSVN-5.1.5补丁原创发布 VisualSVN-5.1.5官方安装包.rar VisualSVN-5.1.5Patch.rar
- AY写给国人的教程- VS2017 Live Unit Testing[1/2]-C#人爱学不学-aaronyang技术分享
原文:AY写给国人的教程- VS2017 Live Unit Testing[1/2]-C#人爱学不学-aaronyang技术分享 谢谢大家观看-AY的 VS2017推广系列 Live Unit Te ...
- 利用WIX制作安装包(3)
原文 利用WIX制作安装包(3) 利用WIX安装服务非常简单.只需要短短几句话就可以.当我们创建好一个Windows服务之后.我们在项目中创建一个Service.wxs 文件来安装服务,并且编辑代码如 ...
- Win8 Metro(C#)数字图像处理--3.4图像信息熵计算
原文:Win8 Metro(C#)数字图像处理--3.4图像信息熵计算 [函数代码] /// <summary> /// Entropy of one image. /// </su ...
- JavaScript生成树形菜单(递归算法)
1.最终效果图(这里仅为实现算法,并加载至页面,不做任何css界面优化) 注释:本示例包含三级目录菜单,但实际上可支持N级(可使用该代码自行测试) 2.数据源 菜单信息一般来源于数据库中数据表,且为自 ...
- VS2008发布项目“发布失败”,没有提示错误
VS2008发布项目时发布失败,但是没有提示任何的错误. 解决方法: 组合键”Ctrl+Alt+O”; 根据这个我知道了,是因为我更改了文件名,发布时找不到导致的,然后在资源管理器中找到那一项,删除或 ...