public class Queen {
// 实例变量,通过实例对象调用
// max表示一共有多少个皇后
int max = 8;
// array用来保存放置的皇后位置
int[] array = new int[max];
// 类变量(静态变量),可被同一类中的任何实例方法调用
static int count = 0;
public static void main(String[] args) {
Queen queen = new Queen();
queen.put(0);
System.out.println("一共有" + count + "种摆放方式,");
}
/**
* 摆放第n个皇后
* @param n 表示摆放的第n个皇后,n取值为0-7
*/
public void put(int n) {
if (n == max) {
print();
return;
}
// 在该行依次将皇后n放入到不同的列,判断是否冲突
for (int i = 0; i < max; i++) {
array[n] = i;
// 如果判断为不冲突,就在下一行放置下一个皇后,开始递归
if (judge(n)) {
put(n+1);
}
// 如果冲突,for循环就将皇后n放入到该行的下一列,开始回溯
}
}
/**
* 摆放第n个皇后之后,判断和前面已经摆放的皇后是否冲突
* @param n 表示第n个皇后,n取值为0-7
* @return 如果和前面已经摆放的皇后不冲突,返回true,否则返回false
*/
public boolean judge(int n) {
for (int i = 0; i < n; i++) {
// array[i] == array[n-1] 判断第n个皇后是否和前n-1个皇后在同一列
// Math.abs(n-i) == Math.abs(array[n] - array[i]) 判断第n个皇后是否和第i个皇后在同一斜线
if (array[i] == array[n] || Math.abs(n-i) == Math.abs(array[n] - array[i])) {
return false;
}
}
return true;
}
/**
* 将皇后摆放的位置输出
*/
public void print() {
count++;
for (int i : array) {
System.out.print(i + " ");
}
System.out.println();
}
}
datastructure:八皇后问题
最新推荐文章于 2024-05-10 09:14:14 发布