简单易理解的回溯法,高效判断素数,可以看我另外两篇博客,这里我也快速简要讲一下。
这一题主要是要领悟回溯法,很关键。
先写一个正常的n个数的求各种排列情况。就1到。。n。的各种排列情况。
方法:正常思路是第一个位置有n种情况,你要写一个长度n的for循环,第二个位置自然是n-1种情况,所以要写一个长度n的for循环,以此类推。。。但是问题来了,你怎么知道传进来的n是多少?你又要写几个for循环?所以你需要用回溯法来递归处理这个情况(当然也有不用递归的方法)。你需要写这样一个方法:你需要写一个标记数组,用来标记这个数字是否访问过了。还有一个标记当前正在处理哪个位数的level,如果level是0,那就是正在为第一位找,所以说不管从哪个位置开始找,方法都是一样的,唯一不同的是你正在为哪一位找以及有哪些数组已经用过了。
上代码
private void sort(int level) { for (int i = 0; i < n; i ++) { if (!flag[i]) { current[level] = i + 1; flag[i] = true;//比如倒数第二层:锁一个 if (level != n - 1) { sort(level + 1);//留一个给最后一层 } else { System.out.println(Arrays.toString(current)); } flag[i] = false;//