全排列 DFS

#include <iostream>
#include <cstring>
using namespace std;
char chars[] = {'a', 'b', 'c'};
char result[3];
int flag[3] ; // 用于标记是否使用过
int len;
// 注意,为了打印,这个函数需要接受一个结果数组,来记录每次递归把那个字符放进去了
void show(int index)
{
int i;
for(i = 0; i < len; i ++)
cout << result[i] << " ";
cout << endl;
}
void DFS(int index)
{
int i;
if(index == len)
show(len); // 找到结果,打印
for(i = 0; i < len; i ++)
if(!flag[i]) // 没有使用过
{
flag[i] = 1; // 标记为已经使用过
result[index] = chars[i]; // 将这次找的结果放进去
DFS(index + 1); // 找下一位
flag[i] = 0; // 回溯
}
// 当函数从for循环中出来的时候,证明当前这一位所有的可能性都找完了,那么会回到上一位的递归
}

int main()
{
memset(flag, 0, sizeof(flag));
len = sizeof(chars) / sizeof(char);
DFS(0);
return 0;
}

原文地址:https://www.cnblogs.com/ghostTao/p/4018805.html