目的:计算出八皇后的所有摆法!
package com.dl;
public class QueenTest {
//定义一个max表示有多少个皇后
int max = 8;
/*1.这里采用一位数组来保存皇后的位置
* 解释:
*例如数组array = {1,2,3,4,5,6,7,8}。
*array[0] = 1; ===> 第一个皇后,在第一行第一列的位置有一个皇后
*array[i] = value ====>皇后的坐标就是 (i+1,value)
*
*/
int[] array = new int[max];
static int count = 0;
public static void main(String[] args) {
// TODO Auto-generated method stub
QueenTest queen = new QueenTest();
queen.putQueen(0);
System.out.println(count);
}
/**
* 此方法用来摆放皇后。
* n表示当前是第几个皇后
* @param n
*/
public void putQueen(int n) {
//先判断是否已经摆放完毕
if(n==max) {
//打印8个皇后的位置
print();
count++;
return;
}
//一次放入皇后,并判断有没有冲突
for(int i = 0;i < max;i++) {
//每次放皇后的时候,首先都把皇后放到行的第一列位置
array[n] = i;
//判断当前位置是否右冲突
if(checkLocation(n)) {
//如果不冲突就接着放下一个皇后
putQueen(n+1);
}
}
}
/**
* 此方法用来检查当前皇后摆放的位置是否正确
* n表示是第几个皇后
* @param n
* @return
*/
public boolean checkLocation(int n) {
for(int i = 0;i<n;i++) {
//检查当前位置的皇后和之前摆放的皇后的位置是否在同一行,同一列,同一条斜线上
/*
*这里解释用到的方法
*1.检查是否在同一行。用 i==n 如果结果为true则表明,两个皇后在同一行
*
*2.检查是否在同一列。用array[i]==array[n] 如果结果为true,则表明两个皇后在同一列上
*
*3.检查是否在同一条斜线上面。这里用到来数学上的斜率=1的知识。即:|(i-n)|==|(array[i]-array[n])|.如果二者的绝对值相等,则表明在同一条斜线上面
*
*/
if((i==n) || (array[i]==array[n]) || (Math.abs(i-n)==Math.abs(array[i]-array[n]))) {
return false;
}
}
return true;
}
//写一个方法,可以将皇后摆放的位置输出
private void print() {
for (int i = 0; i < array.length; i++) {
System.out.print(array[i] + " ");
}
System.out.println();
}
}