/** * 用一个一维数组表示 * arr[7] = 0,1,2,3,4,5,6,7 * arr[i] = val 第i+1个皇后,放在第i+1行,第val列 * 一个一维数组,就表示一组解 */ public class Queue8 { int max = 8; // 表示皇后的数量 int[] arr = new int[max]; public static void main(String[] args) { Queue8 queue8 = new Queue8(); queue8.put(0); } // 放置第n-1个皇后的方法 public void put(int n){ // n从0开始,当 n = max = 8 时,表示已经开始放第九个皇后了 // 此时前8个皇后已经放置完成,就输出这个结果后返回 if(n == max){ print(); return; } // 如果前8个还没有放置好,就需要递归去判断位置是否冲突 for (int i = 0; i < max; i++) { // 新放置的皇后,从每行的第一列开始摆放 // 如果不冲突,放置并判断下一个(递归) arr[n] = i; if(isRight(n)){ put(n+1); } // 如果位置不正确,isRight(n) 返回false // 就不会进入if语句 // 会继续执行for循环,i++,放置在下一个位置,继续判断 } } // 判断摆放位置是否正确 public boolean isRight(int n){ // n从0开始,判断的是第n-1个皇后 /** * 假如现在要判断第二个皇后的位置是否满足要求,就需要判断和第一个皇后的位置是否冲突 * 此时,n = 1, i从0开始,i < n,就是 i < 1,只判断一次 * arr[]数组存放的每一个元素的具体值,代表的是皇后所在的列,而下标,用来表示第几个皇后以及第几行 * 假如第一个皇后放在第一行第一列,则就表示为 arr[0] = 0 * 第二个皇后就是arr[1], 如果 arr[1] = 0, 表示放在第二行的第一列,就和第一个皇后冲突了 * 具体值相等,就意味着在同一列,是不符合要求的 * 如果第二个皇后放在第二列,就表示为 arr[1] = 1 * 此时,abs(n-i) = 1-0 = 1, abs(arr[1] - arr[0]) = 1 - 0 = 1 * 此时它们在同一斜线上,不符合要求 * 也就是,具体值的差,刚好等于了索引下标的差,就意味着在一条斜线上了 * */ for (int i = 0; i < n; i++) { if(arr[i] == arr[n] || Math.abs(n-i) == Math.abs(arr[n] - arr[i])){ return false; } } return true; } // 显示结果 public void print() { for (int i = 0; i < max; i++) { System.out.print(arr[i]); } System.out.println(); // 打印完一组解后再换行 } }
八皇后问题的Java实现
最新推荐文章于 2024-01-13 12:55:25 发布