1. DFS生成排列
众所周知,1,2…n的排列一共有n!个,因此生成全排列至少需要n!的时间复杂度。如果用循环来生成排列,当n稍大时,内外循环会非常之多。可以用DFS模拟解决,生成0 … n-1的排列的代码如下:
void dfs(int depth)
{
int i;
if(depth==n) //n个数排列完毕
{
print the result
return;
}
for(i=0;i<n;i++)
if(!visit[i]) //点i没被访问
{
visit[i]=1;
result[depth]=i;
dfs(depth+1); //进入下一次递归
visit[i]=0; //回溯,将点i重新标记为未被访问
}
}