蛮力法的基础工具——求幂集、全排列算法

//幂集对象 
vector<vector<int>> pwSet{vector<int>()};
//全排列对象 
vector<vector<int>> arrage{vector<int>{1}};

//采用增量穷举思想构造幂集 
void getSet (int n) {
	vector<vector<int>> tempPwSet;
	
	//	每次循环以现有集合为基础新增集合 
	for (int i = 1; i <= n; ++i) {
		tempPwSet = pwSet;
		
		//对现有的每个集合新增同一个元素 
		for (auto itor = tempPwSet.begin(); 
		itor != tempPwSet.end(); ++itor) {
			itor->push_back(i);
			pwSet.push_back(*itor);
		}
	}
}

void print_pwSet () {
	for (auto vec : pwSet) {
		cout << "{ ";
		for (auto val : vec)
			cout << val << " ";
		cout << "}" << endl;
	}
}
void print_arrage () {
	for (auto vec : arrage) {
		cout << "{ ";
		for (auto val : vec)
			cout << val << " ";
		cout << "}" << endl;
	}
}

void insert (vector<int> vec, int num, vector<vector<int>> &vvec)
{
	//对排列vec的所有位置插入num,将得到的每一个新排列存储到vvec中 
	for (int i = 0; i < num; ++i) {
		auto tempVec = vec;
		auto itor = tempVec.begin() + i;
		tempVec.insert(itor, num);
		vvec.push_back(tempVec);
	}
}

//采用增量思想构造全排列 
void getArrage (int n) {
	vector<vector<int>> tempArrage;
	
	//对现有排列集合新增元素 
	for (int i = 2; i <= n; ++i) {
		tempArrage.clear();
		
		//对每个排列新增元素i 
		for (auto itor = arrage.begin(); itor != arrage.end(); ++itor)
			insert(*itor, i, tempArrage);
			
		//将最新得到的排列集合存储到arrage对象中 
		arrage = tempArrage;
	}
}

// 递归版构造幂集(递归思想在蛮力法中的应用)

void insert2 (int i) {
	vector<vector<int>> tempPwSet(pwSet);
	
	for (auto itor = tempPwSet.begin(); itor != tempPwSet.end(); ++itor) {
		itor->push_back(i);
		pwSet.push_back(*itor);
	}
}

void getSet2(int i, int n) {
	if (i <= n) {
		insert2(i);
		// 求解小问题 
		getSet2(i+1, n);
	}
}


//  递归版构造全排列(递归思想在蛮力法中的应用),构造i~n的全排列,因为初始集合有排列:1。所以从f(2,n)开始调用 
void getArrage2 (int i, int n) {
	if (i <= n) {
		vector<vector<int>> tempArrage;
		
		for (auto itor = arrage.begin(); 
		itor != arrage.end(); ++itor)
			insert(*itor, i, tempArrage);
		arrage = tempArrage;
		
		getArrage2(i+1, n);
		
	}
	 
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值