昨天看到面试的问题涉及到八皇后的计算,因为个人感觉八皇后的问题比较难于理解,所以我就看了一个简单的回溯问题
给定一个字符串,给出特定数目字母的所有组合。如字符串abcd给定3个长度的组合有abc abd abd bcd
典型的回溯算法我之前有接触过,其实这个问题有点类似于动态规划的问题,就是分为
子问题1 用这个字母 在接下来的字符串里面选出 少一个长度的所有组合
子问题2 不用这个字母 在接下来的字符串里选出当前唱的的所有组合
关键的问题就是如何确定结束的操作和如何做回溯,把所有的标记的变量都恢复好。
给定一个字符串,给出特定数目字母的所有组合。如字符串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);
}