递归 全排列

#include <iostream>
#include <vector>
#include <memory>
using namespace std;
//123 132 213 231 312 321
void fun(vector<vector<int>> &v,vector<int> &temp,vector<int> &inital,vector<bool> &use) 
{
	if (temp.size()==inital.size()) 
	{
		v.push_back(temp);
		return;
	}
	for (int i = 0; i < inital.size(); i++) 
	{
		if (use.at(i) == true) 
		{
			temp.push_back(inital[i]);
			use.at(i) = false;
			fun(v, temp, inital, use);
			temp.erase(temp.end() - 1);
			use.at(i) = true;
		}
	}
}
int main()
{
	vector<int> inital={1,2,3,4};
	//shared_ptr<vector<int>> temp = make_shared<vector<int>>();
	vector<int > temp;
	vector<vector<int>> v;
	vector<bool> use(inital.size(),true);//最初全部设置可用
	fun(v,temp,inital,use);
	for (auto x : v) 
	{
		for (auto y : x) 
		{
			cout << y<< " ";
		}cout << endl;
	}
	system("pause");
    return 0;
}

今天的算法课讲了递归和分而治之,还记着第一次听这个名词是<<开讲啦>>Robin说的,今天专业的学习了一下。
以全排列为例子,123三个数写出所有的排列方法。分而治之指的是把一个大问题分为若干小问题,每个小问题和
大问题一样。全排列的具体实现,设置参数答案,每个子答案,待选数组,还有一个bool的数组来判断是否可以选,
便利待选数组,没被选过就放进子答案中,然后设置不可选,当子答案和待选数组数量一样结束,然后擦除选过的
子答案最后元素,并将之前的设置成可选。



                
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值