今天看啊哈算法,看到全排列的这个地方,之前没有什么特别好的思路,看了之后获益良多,记一下
下面是深度优先搜索的基本模型
void dfs (int step)
{
判断边界
尝试每一种可能
for(int i=0;i<n;i++)
{
继续下一步 dfs(step++);
}
返回
}
下面是全排列的一个Java实现
**
* 全排列
* 大体思路如下
* 遍历规则遵守顺序拿取 从下标0开始0,1,2
* 假设有元素1,2,3三个元素进行全排列
* ==============================
* A B C
* 1 2 3 第一轮 很正常依次向后取数,每一位都正常取数
* 1 3 2 第二轮 因为第一轮结束的时候C位置无法在向后取数了,则将3取回,然后发现C已经存在过了,在向前取B位置的2,那么在B位置的时候有两个数可用,那么根据规则第一轮已经使用2了,那么将3填进去
* 2 1 3 第三轮 第二轮结束后,依照规则向前将B和C位置的数取回,在到A位置的时候1也需要向下个下标取值了,将2填进去,然后在到B位置的时候从1开始
* 2 3 1
* 3 1 2
* 3 2 1
*/
public class DFS {
/*需要排列的元素*/
public static int[] arr = {1, 2, 3};
/*排列元素的最大值*/
public static int n = arr.length;
/*用来判断是否已经使用*/
public static int[] flag = new int[n];
/*用来记录结果*/
public static int[] result_arr = new int[n];
/**
* @param step 代表从第几个位置开始 A,B,C
*/
public static void dfs(int step) {
/**
* 如果到了最后一个位置,将结果输出
*/
if (step == n) {
for (int i = 0; i < n; i++) {
System.out.printf(String.valueOf(result_arr[i]));
}
System.out.println();
return; //返回到之前一步,最近一次调用dfs的地方
}
/**
* 按照顺序依次取可以使用的元素
*/
for (int i = 0; i < n; i++) {
/**
* flag[i]==0代表元素可以使用
*/
if (flag[i] == 0) {
// 将元素放到指定位置
result_arr[step] = arr[i];
// 将flag[i]置为1,代表不可用,被占用
flag[i] = 1;
// 去下一个位置
dfs(step + 1);
// 这步很重要,释放之前被占用的元素
flag[i] = 0;
}
}
return;
}
public static void main(String[] args) {
dfs(0);
}
}```
> 参考啊哈算法第四章第一节 73p