8x8 的棋盘,8 个棋子(皇后),每个棋子所在的行、列、对角线都不能有另一个棋子
//全局或成员变量,下标表示行,值表示queen存储在哪一列
int[] result = new int[8];
public void cal8queens(int row) {
if (row == 8) {
// 8个棋子都放置好了,打印结果
printQueens(result);
return;
}
// 每一行都有8中放法
for (int column = 0; column < 8; ++column) {
//判断是否满足要求
if (isOk(row, column)) {
// 第row行的棋子放到了column列
result[row] = column;
// 考察下一行
cal8queens(row + 1);
}
}
}
////判断row行column列放置是否合适
private boolean isOk(int row, int column) {
int leftup = column - 1, rightup = column + 1;
// 逐行往上考察每一行
for (int i = row - 1; i >= 0; --i) {
//判断i行的column是否有。
if (result[i] == column) {
return false;
}
//判断左上对角线是否有
if (leftup >= 0) {
if (result[i] == leftup) {
return false;
}
}
//判断右上对角线是否有
if (rightup < 8) {
if (result[i] == rightup) {
return false;
}
}
--leftup;
++rightup;
}
return true;
}
private void printQueens(int[] result) { // 打印出一个二维矩阵
for (int row = 0; row < 8; ++row) {
for (int column = 0; column < 8; ++column) {
if (result[row] == column) {
System.out.print("Q ");
} else {
System.out.print("* ");
}
}
System.out.println();
}
System.out.println();
}
网友评论