回溯:沿着一条路线一直走下去,不满足时,再掉头换路。
例题:
要求输出1-m中,k个数的组合
#include<bits/stdc++.h>
using namespace std;
int* temp;
int ts = 0;
void hs(int s, int e, int k)
{
if (ts + e - s + 1 < k) //临界条件
return;
if (ts == k) //输出结果
{
for (int i = 0; i < k; i++)
cout << temp[i];
cout << endl;
return;
}
temp[ts++] = s; //存取当前数,并且为下一个数的读取服务
hs(s + 1, e, k); //调取下一个数
ts--; //取消存放当前的数
hs(s + 1, e, k); //从当前数的下一个开始取数
}
int main()
{
int m = 4, k = 2;
temp = (int*)malloc(sizeof(int) * k);//在栈中申请k个int字节的空间
hs(1, m, k);
}