回溯法求解全排列问题

#include
#include
using namespace std;


void swap(char *a, char *b)
{
*a = *a + *b;
*b = *a - *b;
*a = *a - *b;
}

void pl(char *a, char * begin)
{
if (*begin == '\0')
{
cout << a << endl;
}
for (char *p = begin; *p != '\0'; p++)
{
swap(*begin, *p);
pl (a, begin + 1);
swap(*p, *begin);
}

}


int main()
{
char a[] = "abc";
pl(a, a );
system("pause");

}


总结:回溯法思路类似于深度优先遍历,

要求单个解时,返回一条满足条件的 从根到叶子的路径;

多个解时,要遍历所有结点(根据需要满足的条件用剪枝函数避免无效搜索),返回多个从根到叶子的路径;


解的结果类似一个栈,根为栈底,叶子为栈顶



你可能感兴趣的:(C++)