八皇后问题就是一个八行八列的棋盘上放棋,要求每一行、每一列、每一条斜线上不能有两个棋,同一行相当于说的废话,也就是从第一行放到第八行,要求同一列和同一条斜线上不能有两个棋。由于是个二维棋盘按理应该来个二维数组,但由于只是找出所有路线,二维还不好操作,而一维数组却很好用:建立一个8个容量的一维数组,0索引上的数就是第一行皇后的位置,7索引位置上的数就是第八个皇后的位置
思路:明显是递归回溯,而且每一行有八个位置,因此使用一个index变量来记录当前在放第几个皇后,使用一个for循环,当前皇后接下来放置的位置只要和之前的没有冲突就可以放下去并且去放下一个皇后,直到放完八个皇后,放完八个皇后之后直接return开始回溯。
代码如下:
package cn.java.study.review.recursize;
import java.util.Arrays;
/*八皇后问题*/
public class deathQueen {
static int[] arr = new int[8];
static void set(int[] arr, int index) {
if (index == 8) {
System.out.println(Arrays.toString(arr));
return;
}
for (int i = 0; i < 8; i++) {
if (isConflict(i, index)) {
arr[index] = i;
set(arr, index + 1);
}
}
}
/**
* @param dest 将要放在第几个位置上
* @param i 当前是第几个皇后
* @return 判断将要放得位置是否与之前的冲突
*/
static boolean isConflict(int dest, int i) {
for (int a = 0; a < i; a++) {
if (arr[a] == dest || Math.abs(i - a) == Math.abs(dest - arr[a])) {
return false;
}
}
return true;
}
public static void main(String[] args) {
set(arr,0);
}
}