基本回溯问题

昨天看到面试的问题涉及到八皇后的计算,因为个人感觉八皇后的问题比较难于理解,所以我就看了一个简单的回溯问题
给定一个字符串,给出特定数目字母的所有组合。如字符串abcd给定3个长度的组合有abc abd abd bcd 


典型的回溯算法我之前有接触过,其实这个问题有点类似于动态规划的问题,就是分为
子问题1 用这个字母 在接下来的字符串里面选出 少一个长度的所有组合
子问题2 不用这个字母 在接下来的字符串里选出当前唱的的所有组合
关键的问题就是如何确定结束的操作和如何做回溯,把所有的标记的变量都恢复好。

现在我给出我的代码


#include<iostream>
#include<string>
using namespace std;
void show();

int *mark;//0 未使用  1 已经使用
int inputLength;
string input;

int currentTotalLength=3;
int currentLength;

void fun(int beginIndex)
{
	if(beginIndex==inputLength)
	{
		return;
	}

	//不用
	fun(beginIndex+1);

	//用
	mark[beginIndex]=1;
	currentLength++;
	if(currentLength==currentTotalLength)
	{
		show();
		mark[beginIndex]=0;
		currentLength--;
		return;
	}
	fun(beginIndex+1);
	mark[beginIndex]=0;
	currentLength--;



}

void show()
{
	for(int i=0;i<inputLength;i++)
	{
		if(mark[i])
		{
			cout<<input[i];
		}
	}
	cout<<endl;
	return;
}

int main()
{

//	cin>>input;
//	inputLength=input.length();
//	mark=new int[inputLength];
//	for(int i=0;i<inputLength;i++)
//	{
//		mark[i]=0;
//	}


	input="abcd";
	inputLength=4;
	mark=new int[4];
	for(int i=0;i<inputLength;i++)
	{
		mark[i]=0;
	}
	fun(0);

}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值