本文Java代码转载自微信公众号“算法文摘”,作者danqiusheng。
原文地址:https://github.com/danqiusheng/algorithm_practice/blob/master/src/dfs/NormalFullV1.java
从微信公众号~“算法文摘”,看到一篇关于深度优先搜索的文章,文章中前半部分提到对1~4数字的全排,讲到一种简单粗暴的方法~暴力穷举,用4个for循环来穷举所有排列可能。算法的核心代码(Java)如下:
public static void main(String[] args)
{
int count = 0;// 记录排序次数
int[] arr = new int[5]; // 存储结果
for (arr[1] = 1; arr[1] < 5; arr[1]++)
{
for (arr[2] = 1; arr[2] < 5; arr[2]++)
{
for (arr[3] = 1; arr[3] < 5; arr[3]++)
{
for (arr[4] = 1; arr[4] < 5; arr[4]++)
{
int[] result = new int[5];// 判断是否重复,含有5个元素的数组result
boolean flag = true;
for (int i = 1; i < 5; i++)
{
result[arr[i]] += 1;
if(result[arr[i]] > 1) //由相加个数,判断是否重复
flag = false; // 判断当前数字是否重复出现
}
if(flag)
{ // 所有的数字出现
System.out.println(arr[1] + "" + arr[2] + "" + arr[3] + "" + arr[4]);
count++;
}
}
}
}
}
System.out.println("total count:"+count);
}
上述代码中,在eclipse里验证过,整个主函数部分是没有错误,编译无误,可以运行。经debug后自己也理解每行代码如何执行,以及执行后的数组变化,但目前自己对作者上述代码还没有理解其原理。
如上述
if(result[arr[i]] > 1) //由相加个数,判断是否重复
flag = false; // 判断当前数字是否重复出现
部分,就是自己暂时没有理解的内容,不懂为何通过相加个数,就能判断是否重复。总之,对于整个代码结构还是没有理解。