在8×8格的国际象棋上摆放8个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行、同一列或同一斜线上,问有多少种摆法?
使用递归的解法
//八皇后问题
public class EightQueens {
public static int[][] map;//棋盘
public static int count = 0;//记录符合条件的数量
public static int n;//棋盘大小
//测试
public static void main(String[] args) {
n = 8;//棋盘大小为8*8
map = new int[n][n];//初始化棋盘
getResult(0);//开始计算
System.out.println(count);//打印结果
}
//运算
public static void getResult(int i) {
for (int j = 0; j < n; j++) {
map[i][j] = 1;//添加棋子
if (isRight(i, j)) {//在原有基础上,判断能否添加
if (i == n - 1) { //递归到最后一行,判断该位置可行,则加一
count++;
} else {
//不是最后一行,位置可行,继续递归到下一行
getResult(i + 1);
}
}
//棋子不能在该位置或成功匹配后
map[i][j] = 0;//清除棋子
}
}
//判断棋子是否可行
public static boolean isRight(int x, int y) {
//判断当前位置的上面棋子是否会冲突
for (int i = 0; i < x; i++) {
//正上方,左斜上方,右斜上方
if (map[x][y] == map[i][y]) {
return false;
} else if (y - x + i >= 0 && y - x + i < n && map[x][y] == map[i][y - x + i]) {
return false;
} else if (y + x - i >= 0 && y + x - i < n && map[x][y] == map[i][y + x - i]) {
return false;
}
}
return true;
}
}