八皇后问题:在8X8的国际象棋棋盘上摆放八个皇后,使她们不能互相攻击,也就是任意两个皇后不能位于同一行、同一列、同一条斜线上。求出有多少种摆法?
首先我们可以将第一个皇后放在第一行第一列,
然后第二个皇后从第二行的第一列这个位置开始,判断是否可以放在这里。如果不可以的话,就依次放到第二列、第三列…等等找到那个可以的位置
接着放第三个皇后,也是从第三行的第一列开始,和第二个皇后找位置遵循的方法一样找到合适的位置。
直到最后将八个皇后都能放到合适的位置,就算是找到了一个正确的摆法。
在得到一个正确的摆法之后,就会开始回溯,找到第一个皇后放在第一行第一列的所有的正确的摆法。然后将第一个皇后放在第一行第二列,找到所有解。以此类推。
下面是代码:
public class EightQueen {
//定义一个变量表示有多少个皇后
int maxSize = 8;
//定义一个数组来表示皇后的位置,依次为第1、2、3、、、、8行的位置
int[] location = new int[maxSize];
static int printCount = 0;
public static void main(String[] args) {
EightQueen eightQueen = new EightQueen();
eightQueen.locate(0);
System.out.printf("--total %d solutions--",printCount);
}
//摆放皇后,在方法中判断是否位置是否可以
public void locate(int n){
if (n == maxSize){
printLocation();
return;
}
for (int i = 0; i < maxSize; i++) {//这里i是n行(即第n个皇后)的i列
location[n] = i;
if (judgeLocation(n)){//如果第n个皇后摆放正确,就摆放下一个皇后
locate(n+1);
}
}
}
/**
* 判断皇后的位置摆放是否正确
* @param n 表示第n个皇后
* @return
*/
public boolean judgeLocation(int n){
//和前面已经确定位置的所有皇后比较,判断当前皇后的位置是否合适
for (int i = 0; i < n; i++) {
//location[i] == location[n]是代表放在同一列了
//Math.abs(location[n]-location[i]) == Math.abs(n-i)放在一条斜线上了
if (location[i] == location[n] || Math.abs(location[n]-location[i]) == Math.abs(n-i)){
return false;
}
}
return true;
}
//输出皇后摆放的位置
public void printLocation(){
for (int i = 0; i < maxSize; i++) {
System.out.print(location[i]+" ");
}
System.out.println();
printCount++;
}
}
注:此为学习笔记。