整数变换问题

问题描述:

关于整数i的变换f和g定义如下:f(i)=3i;g(i)=i/2。

现要求对于给定的2个整数n和m,用最少的f和g变换次数将n变换为m。

例如,可以将整数15用4次变换将它变换为整数4:4=gfgg(15)。当整数n不可能变换为整数m时,算法应如何处理?这里假定每个问题都有解。

输入:

有多组输入数据,每行有2个正整数n和m。

输出:

对每组输入,如果不可能在至多25次的变换中将n变到m,那么直接输出“No Solution!”,否则输出最少的变换次数以及相应的变换序列。我们约定f比g在先。对两个满足要求的变换序列A=anan-1..a2.a1、B =bnbn-1..b2b1,我们采用字典序,输出最小的那个,但该字典序是从后开始比较的,即从第1个变换a1和b1开始比较,依次考察是否相同,只要有一个不同,那么有f的那个在先。

输入样例:

15 4

4563 22334

输出样例:

4

gfgg

No Solution

#include "stdafx.h"
#include<vector>
#include<iostream>

using namespace std;
typedef unsigned char byte;
struct  Node
{
	vector<byte>path;
	int current_value;
};
Node solution;
vector<Node>nextnodelist;
bool integer_trans(int m, int n, vector<Node>nodelist)
{
	if (nodelist[0].path.size() == 25)
	{
		cout << "已达到最大层数,未找到" << endl;
		return true;
	}
	nextnodelist.clear();
	cout << nextnodelist.size() << endl;
	int k = 0;
	while (k < nodelist.size())
	{
		if (nodelist[k].current_value % 3 == 0)
		{
			Node node;
			node.path = nodelist[k].path;
			node.path.push_back(0);
			node.current_value = nodelist[k].current_value / 3;
			nextnodelist.push_back(node);
			if (node.current_value == n)
			{
				solution = node;
				return true;
			}
		}

		Node node1;
		node1.path = nodelist[k].path;
		node1.path.push_back(1);
		node1.current_value = nodelist[k].current_value * 2;
		nextnodelist.push_back(node1);
		if (node1.current_value == n)
		{
			solution = node1;
			return true;
		}

		Node node2;
		node2.path = nodelist[k].path;
		node2.path.push_back(2);
		node2.current_value = nodelist[k].current_value * 2+1;
		nextnodelist.push_back(node2);
		if (node2.current_value == n)
		{
			solution = node2;
			return true;
		}

		k++;
	}

	return false;

}

void solve(int m, int n)
{
	Node nn;
	nn.current_value = m;
	nextnodelist.push_back(nn);
	bool flag = false;
	while (!flag)
	{
		vector<Node>nodelist(nextnodelist);
		flag = integer_trans(m, n, nodelist);
	}
}

int _tmain(int argc, _TCHAR* argv[])
{
	solve(4, 15);

	system("pause");
	return 0;
}

从后往前搜索。

每个node存储它之前操作的记录,0代表f,即/3,1代表*2,2代表*2+1,value存储当前值。nodelist只存储一层的节点即可。

因为每次对f先进行操作,也先进行存储,所以找到的第一个满足要求的解也是字典序最小的,直接返回即可。

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-08-13 18:45:21

整数变换问题的相关文章

AVS-P2中的8x8二维整数余弦变换(Integer Cosine Transform, ICT)

为何采用ICT? 基于块的DCT能很大程度上去除图像元素在变换域中的相关性,在图像和视频编码领域得到广泛的应用.但由于DCT存在计算量大以及存在反变换失配,因此AVS Part 2采用的是ICT,其性能接近8x8 DCT,但精确定义到每一位的运算避免了不同反变换之间的失配.ICT具有复杂度低.完全匹配等优点.ICT可用加法和移位直接实现. 何为ICT? 整数余弦变换(Integer Cosine Transform, ICT)源自离散余弦变换,是定点余弦变换的扩展.设一个二维数据块X大小为nxm

编码器变换及量化的流程?

H.264 对图像或预测残差采用了4×4 整数离散余弦变换技术.在图像编码中,变换编码和量化从原理上讲是两个独立的过程.但在H.264 中,将两个过程中的乘法合二为一,并进一步采用整数运算,减少编解码的运算量,提高图像压缩的实时性,这些措施对峰值信噪比(PSNR)的影响很小,一般低于0.02dB,可不计.H.264 中整数变换及量化具体过程如图6.46 所示.其中,如果输入块是色度块或帧内16×16 预测模式的亮度块,则将宏块中各4×4块的整数余弦变换的直流分量组合起来再进行Hadamard 变

视频编解码学习之三:变换,量化与熵编码

第6章 变换编码 1. 变换编码 变换编码的目的 去除空间信号的相关性 将空间信号的能力集中到频域的一小部分低频系数上 能量小的系数可通过量化去除,而不会严重影响重构图像的质量 块变换和全局变换 块变换:离散余弦变换(Discrete Cosine Transform,DCT),4x4,8x8,16x16 全局变换:小波变换(Wavelet) 变换的能量集中特性 DCT编码 2. 变换类型 K-L变换 傅里叶变换 余弦变换 小波变换 3. KL变换 最优变换 基函数根据具体图像而确定 没有快速算

各种音视频编解码学习详解

各种音视频编解码学习详解 媒体业务是网络的主要业务之间.尤其移动互联网业务的兴起,在运营商和应用开发商中,媒体业务份量极重,其中媒体的编解码服务涉及需求分析.应用开发.释放license收费等等.最近因为项目的关系,需要理清媒体的codec,比较搞的是,在豆丁网上看运营商的规范 标准,同一运营商同样的业务在不同文档中不同的要求,而且有些要求就我看来应当是历史的延续,也就是现在已经很少采用了.所以豆丁上看不出所以然,从 wiki上查.中文的wiki信息量有限,很短,而wiki的英文内容内多,删减版

x264代码剖析(十五):核心算法之宏块编码中的变换编码

x264代码剖析(十五):核心算法之宏块编码中的变换编码 为了进一步节省图像的传输码率,需要对图像进行压缩,通常采用变换编码及量化来消除图像中的相关性以减少图像编码的动态范围.本文主要介绍变换编码的相关内容,并给出x264中变换编码的代码分析. 1.变换编码 变换编码将图像时域信号变换成频域信号,在频域中图像信号能量大部分集中在低频区域,相对时域信号,码率有较大的下降. H.264对图像或预测残差采用4×4整数离散余弦变换技术,避免了以往标准中使用的通用8×8离散余弦变换逆变换经常出现的失配问题

视频编码格式全面解析

我们在详解各种主流的视频格式之前,先抛开各种视频格式的定义,来讨论这样一件事情:你觉得目前的视频格式编码混乱吗?相信这个问题问出来,许多..不同知识层次的人有不同的思考,但是答案却都有一个共同点就是:"混乱". 从我们在接触网络上面看电影以来,就会遇到从原先我们熟知的RMVB格式的视频到后来接触的MP4.3GP等格式的视频就会感到为什么同样是AVI的视频,我的MP4却不支持,而别人的就可以呢?这里就涉及到了视频编码与封装格式的问题.本文主要是针对视频编码进行讨论,以后会在下次为大家讲解

视频编解码

所谓视频编码方式就是指通过特定的压缩技术,将某个视频格式的文件转换成另一种视频格式文件的方式.视频流传输中最为重要的编解码标准有国际电联的H.261.H.263.H.264,运动静止图像专家组的M-JPEG和国际标准化组织运动图像专家组的MPEG系列标准,此外在互联网上被广泛应用的还有Real-Networks的RealVideo.微软公司的WMV以及Apple公司的QuickTime等. 中文名 视频编码 外文名 Video Encoding 分    类 H.26x系列,MPEG系列,AVS

H264编码技术

H.264的目标应用涵盖了眼下大部分的视频服务,如有线电视远程监控.交互媒体.数字电视.视频会议.视频点播.流媒体服务等.H.264为解决不同应用中的网络传输的差异.定义了两层:视频编码层(VCL:Video Coding Layer)负责高效的视频内容表示,网络提取层(NAL:Network Abstraction Layer)负责以网络所要求的恰当的方式对数据进行打包和传送.如图3.19所看到的.    图3.19  标准的总体框架 基本层次(Baseline Profile):该层次使用了

H.264的变换编码(一)——矩阵运算与正交变换基本概念

<H.264/AVC视频编解码技术详解>视频教程已经在"CSDN学院"上线,视频中详述了H.264的背景.标准协议和实现,并通过一个实战工程的形式对H.264的标准进行解析和实现,欢迎观看! "纸上得来终觉浅,绝知此事要躬行",只有自己按照标准文档以代码的形式操作一遍,才能对视频压缩编码标准的思想和方法有足够深刻的理解和体会! 链接地址:H.264/AVC视频编解码技术详解 GitHub代码地址:点击这里 1. 矩阵的定义 矩阵,英文称为"Ma