整数变换问题-回溯算法-C++

问题描述:整数i的两种变换定义为 f(i)=3i,g(i)=i/2(向下取整);设计一个算法求给定两个整数n和m,用最少次数的f 和 g变换将整数n变换为m;例如 :可以将整数15通过4次变换将它变成4,4=gfgg(15)。当整数n不可能转换为m时,算法应当怎么处理。本题是当出现重复数字,认为无法转换。
代码如下:

#include <iostream>
#include<stdlib.h>
#include <vector>
//vector是用数组实现的,每次执行push_back操作,相当于底层的数组实现要重新分配大小(即先free掉原来的存储,后重新malloc)
using namespace std;

vector<char> a;//头文件#include <vector>中包含方法push_back,这里使用是为了方便向数组中插入符号
vector<int> s;
int sum = 1, flag = 1;//sum表示转换次数,flag是为了输出无法变换时更加美观

bool Solve(int k,int n,int m)
{
	int b=0;

	//当执行次数过多,出现重复数字时,认为其无法转换
	for (int i = 0; i < s.size(); i++)
	{
		if (b == s[i])
		{
			printf("无法变换!\n");
			flag = 0;
			return true;
		}
	}
	//当转换次数过多,不符合最简转换要求
	if (k > sum)
		return false;
	b = n;
	//将出现过的n进行存储,方便判断
	s.push_back(n);
	
	for (int i = 0; i < 2; i++)
	{
		if (i == 0)
			b = n * 3;
		else
			b = n / 2;
		//当两者相等,或深度检索,递归可相等时
		if (b == m || Solve(k + 1,b,m))
		{
			if (i == 0)
				a.push_back('f');
			else
				a.push_back('g');
			return true;
		}
	}
	return false;
}
int main() 
{
	int n, m;//n,m为两个整数
	cout << "请输入待转换整数n:";
	cin >> n;
	cout << "请输入目标整数m:";
	cin >> m;
	while (!Solve(1,n,m))//一次转化无法成功时,次数加一
		sum++;
	while (flag) //为了输出无法转换更加美观
	{
		cout << sum << endl;
		for (int i = 0; i < a.size(); i++)
			cout << a[i];
		cout << endl;
		flag = 0;
	}
	system("PAUSE");
	return 0;
}

示例输入输出:
在这里插入图片描述
学习中,欢迎交流

  • 2
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值