以8皇后为例:
public class EightQueen {
private static int N = 8;
private static int cnt=0;//定义最终能有多少中摆法
public static void eightQueen(int[] selected, int row) {
if (row > N - 1) {//如果遍历到了最后一行,就说明此次8行可以实现
cnt++;//次数+1
return;
}
//如果没有遍历到最后一行,就遍历该行(row)的每一列
for (int i = 0; i < N; i++) {
//如果当前行的第i个满足
if (isValid(row, i, selected)) {
selected[row] = i;//设置第row行选择的位置为i
eightQueen(selected, row + 1);//然后遍历下一行
selected[row] = -1;//回溯
}
}
}
private static boolean isValid(int row, int column, int[] selected) {
int leftup = column - 1;//当前位置的左上列
int rightup = column + 1;//当前位置的右上列
for (int i = row - 1; i >= 0; i--) {//依次遍历前边所有行
if (selected[i] == column) {//如果该行之前的某一行已经选择了该列
return false;
}
//判断有没有对角线
if (leftup >= 0) {
if (selected[i] == leftup) {//如果跟该位置处于对角线上
return false;
}
}
if (rightup <= N - 1) {
if (selected[i] == rightup) {
return false;
}
}
//★★★★★★★★★★★★★
leftup--;
rightup++;
//★★★★★★★★★★★★★
}
//对于第0行的直接返回true
return true;
}
//测试
public static void main(String[] args) {
int[] selected = new int[N];
eightQueen(selected,0);
System.out.println(cnt);
}
}