0
点赞
收藏
分享

微信扫一扫

C++暴力递归

哈哈镜6567 2022-05-03 阅读 50
c++算法

C++暴力递归相关题目

#include<iostream>
#include<vector>
#include<string>
#include<list>
#include<algorithm>
#include<stack>
using namespace std;
//1.汉诺塔问题
//2.打印一个字符串的全部子序列
//3.打印一个字符串的全部排列(要求不出现重复的排列)
//4.聪明人游戏:给定一个整数数组,代表数值不同的纸牌排成一条线,玩家A和玩家B依此拿走每张纸牌规定玩家A先拿,玩家B后拿,但是每个玩家每次只能拿走最右或最左的纸牌,玩家A和玩家B都是绝顶聪明,请返回最后获胜者的分数
//5.逆序一个栈(不能用额外空间)
//6.对应转换  :1和A对应 2和B对应,,26和Z对应
//7.给定两个长度为N的数组weights和values,weights[i]和values[i]分比尔代表i号物品的重量和价值,给定一个整数bag表示一个载重bag的袋子,你长的物品不能超多这个重量,返回你能装下最多的价值是多少

//1.汉诺塔问题
void func(int i, string start, string end, string other)
{
	if (i == 1)
	{
		cout << "Move 1 from" << start << "to" << end << endl;
	}
	else
	{
		func(i - 1, start, other, end);
		cout << "Move" << i << "from" << start << "to" << end << endl;
		func(i - 1, other, end, start);
	}
}
void hanoi(int n)
{
	if (n > 0)
	{
		func(n, "左", "右", "中");
	}
}

//2.打印一个字符串的所有子排列(子集)
void process(string str, int i)
{
	if (i == str.length())
	{
		cout << str << endl;
		return;
	}
	process(str, i + 1);
	char tmp = str[i];
	str[i] = NULL;
	process(str, i + 1);
	str[i] = tmp;
}
void printAllSubsquence(string str)
{
	process(str, 0);
}

//3.打印一个字符串的全部排列(要求不能出现重复排列)
void swap(string str, int i, int j)
{
	char ch = str[i];
	str[i] = str[j];
	str[j] = ch;
}
void process(string str, int i, list<string>res)
{
	if (i == str.length())
	{
		res.push_back(str);
	}
	bool visit[26]{};
	for (int j =i;j<str.size();j++)
	{
		if (!visit[str[j]] - 'a')
		{
			visit[str[j] - 'a'] = true;
			swap(str, i, j);
			process(str, i + 1, res);
			swap(str, i, j);
		}
	}
}
list<string> printFullArry(string str)
{
	list<string>res;
	process(str, 0, res);
	return res;
}

//4.聪明人游戏
int f(vector<int>& nums, int i, int j);
int s(vector<int>& nums, int i, int j)
{
	if (i == j)
	{
		return 0;
	}
	return min(f(nums, i + 1, j), f(nums, i, j - 1));
}
int f(vector<int>& nums, int i, int j)
{
	if (i == j)
	{
		return nums[i];
	}
	return max(nums[i] + s(nums, i + 1, j), nums[j] + s(nums, i, j - 1));
}
int win1(vector<int>&nums)
{
	if (nums.size()==0)
	{
		return 0;
	}
	return max(f(nums, 0, nums.size() - 1), s(nums, 0, nums.size() - 1));
}
int win2(vector<int>& nums)
{
	if (nums.size() == 0)
	{
		return 0;
	}
}
//逆序一个栈
int f(stack<int>stc)
{
	int result = stc.top();
	stc.pop();
	if (stc.empty())
	{
		return result;
	}
	int last = f(stc);
	stc.push(result);
	return last;
}
void reverse(stack<int>stc)
{
	if (stc.empty())
	{
		return;
	}
	int i = f(stc);
	reverse(stc);
	stc.push(i);
}
//对应转换问题
int process(vector<char>str, int i)
{
	if (i == str.size())
	{
		return 1;
	}
	if (str[i] == '0')
	{
		return 0;
	}
	if (str[i] == '1')
	{
		int res = process(str, i + 1);
		if (i + 1 < str.size())
		{
			res += process(str, i + 2);
		}
		return res;
	}
	if (str[i] == '2')
	{
		int res = process(str, i + 1);
		if (i + 1 < str.size() && (str[i + 1] >= '0' && str[i + 1] <= '6'))
		{
			res += process(str, i + 2);
		}
		return res;
	}
	return process(str, i + 1);
}
//7.给定两个长度为N的数组weights和values,weights[i]和values[i]分比尔代表i号物品的重量和价值,给定一个整数bag表示一个载重bag的袋子,你长的物品不能超多这个重量,返回你能装下最多的价值是多少
int process1(vector<int>& weights, vector<int>values, int i, int alreadyweight, int bag)
{
	if (alreadyweight > bag)
	{
		return 0;
	}
	if (i == weights.size())
	{
		return 0;
	}
	return max(process1(weights, values, i + 1, alreadyweight, bag), values[i]+process1(weights, values, i + 1, alreadyweight + weights[i], bag));
}
int main()
{
	system("pause");
	return 0;
}
举报

相关推荐

算法-暴力递归

9-暴力递归/暴力尝试

C++递归

硬币(暴力穷举 c++)

C++递归思想

C++快速幂(递归)

0 条评论