点击查看代码
package com.smallchange.s3_4;
public class Queens {
// 八皇后问题,在一个8×8的国际象棋棋盘上摆放8个皇后,摆放需遵守皇后不能处于同一行、同一列、同一斜线上,问有多少种摆法
int max = 8;//皇后个数
static int count = 0;//记录有多少种摆法
// 初始化一个数组用于存放结果
int[] arr = new int[max];
public static void main(String[] args) {
// TODO Auto-generated method stub
Queens queens = new Queens();
queens.putQueens(0);
System.out.println("共有"+count+"种摆法");
}
//写一个摆皇后的方法
private void putQueens(int n) {
if(n==max) {//因为n是从0开始增加,即n=0表示放第一个皇后,当n==max时表示皇后已经摆完了
Print();
return;
}
for(int i=0;i<max;i++) {
arr[n]=i;//放置第一个皇后
if(judge(n)) {//判断皇后的位置是否冲突,不冲突继续放下一个皇后
putQueens(n+1);
}
}
}
// 写一个方法,判断皇后在该位置是否会引起冲突,即在同一行或同一列或同一斜线
private boolean judge(int n) {
for (int i = 0; i < n; i++) {
/*
1. 判断 皇后是否在同一列,只需判断皇后的列坐标是否相等即可,即arr[i] == arr[n]
2.判断皇后是否在同一斜线上,只需判断两个皇后的列坐标之差的绝对值与其横坐标之差的绝对值是否相等即可,
*/
if (arr[i] == arr[n] || Math.abs(n - i) == Math.abs(arr[i] - arr[n])) {
return false;//违反了规则,返回false
}
}
return true;
}
//输出
private void Print() {
// TODO Auto-generated method stub
for(int i=0;i<arr.length;i++) {
System.out.print(arr[i] + " ");
}
count++;
System.out.println();
}
}