题目:求1,2,...,N的全排列。例,N=3时,共有六种:
思路:回溯法就是先确定某一部step的选择,选择之后要置状态为1,以表示某个资源已被使用;然后把“选择”和当前状态传到到step+1,直到第N+1步,才结束。然后回溯回去的时候,要重新置状态为0,这一点是回溯法的重要标志!
#include <stdio.h>
#define N 3
void print_elems(int* a)
{
int i;
for (i = 1; i <= N;++i)
{
printf("%d ", a[i]);
}
}
void dfs(int step, int* a, int* book)
{
if (step==N+1)
{
print_elems(a);
printf("\n");
return;
}
for (int i = 1; i <= N;++i)
{
if (*(book + i) == 0)
{
*(book + i) = 1;
a[step] = i;
dfs(step + 1, a, book);
*(book + i) = 0;
}
}
}
int main(void)
{
int a[N+1] = { 0 };
int book[N+1] = { 0 };
dfs(1, a, book);
return 0;
}
c++代码:
<pre name="code" class="cpp">#include <iostream>
#include <vector>
using namespace std;
#define N 3
void print_elems(vector<int>& v)
{
for (vector<int>::const_iterator it = v.begin(); it != v.end();++it)
{
cout << *it << " ";
}
}
void dfs(vector<int>& re, vector<int>& status, int step)
{
if (step==N)
{
print_elems(re);
cout << endl;
return;
}
for (int i = 1; i <= N;++i)
{
if (status[i] == 0)
{
re.push_back(i);
status[i] = 1;
dfs(re, status, step + 1);
re.pop_back();
status[i] = 0;
}
}
}
int main(void)
{
vector<int> status(N+1, 0);
vector<int> result;
dfs(result,status,0);
return 0;
}