
public class Demo4 { int size; int[] vector;//存储当前解向量 boolean[] used;//存储当前解空间中哪些数据已经被使用过 int amount = 0; public Demo4(int size){ this.size = size; vector = new int[size]; used = new boolean[size]; } /** * 迭代算法,通过used数组来确定当前层可用解,然后进入下一层重复通用动作。 * 当到最终层后修改used数组,回溯。 * @param level 当前层,对应为解向量的数组下标。 */ public void sort(int level){ for(int i=0;i<size;i++){//从0到size-1,一共size层 if(!used[i]){//找到当前层第一个没有被使用的解 vector[level]=i;//把这个解赋予解向量的当前层 used[i] = true;//标记当前解已经被使用 if(level!=size-1)//如果不是最后一层,则递归进行下一层的排序 sort(level+1); else System.out.println((++amount)+":"+Arrays.toString(vector));//如果是最后一层,打印输出 used[i]=false;//这是回溯的关键! /* * 到达上一条语句的来源,可以分为两种情况: * 1是到达最后一层,i是最后一个可用元素在解空间的下标,自然要将其对应的解“解锁”,即标为未使用。 * 2是刚刚推出递归,也就是当前层的解为解空间i的情况刚刚递归完成,所以也要对解进行“解锁”。 */ } } } public static void main(String[] args) { new Demo4(6).sort(0); } }
代码上面的注释也写得蛮清楚的,相信各位看官也都看得懂!回溯的关键点之一就是找好回溯点,觉得这个算法真的满巧妙的!通过设置全局变量实现的数字的动态变化!真心的要点个赞!