思路 :
设计一个一维数组,长度为8,每个值是存的皇后的列值(按照八皇后规则,一维数组里的值应该为0~7之间个不相同),每放一个皇后就相当于是下一行 所以在判断皇后当前位置是否可以的时候就可以不用判断行
/**
*//**八皇后问题
*
* @author 江佳洋
*
*/
public class Queen {
final int MAX = 8;
int array[] = new int [MAX];//定义以为数组 每一个地方存的是皇后的列地址
public static void main(String[] args) {
new Queen().check(0);
}
/**
* qaq 开始执行八皇后 自带回溯
* @param n
*/
private void check(int n) {
if(n==MAX) {
print();
return;
}
for(int i=0;i<MAX;i++) {
array[n] = i;
if(judge(n)) {
//每一个check都会有一次MAX的循环 所以会自带回溯 ,所有可能都会遍历到
check(n+1);
}
}
}
/**
* qaq 判断当前的皇后位置可不可以
* @param n 当前的是第几个皇后
* @return
*/
private boolean judge(int n) {
for(int i=0;i<n;i++) {
//判断列是否相同array[i]==array[n] 值相同就说明两个皇后在相同列
//判断是否是一个斜线Math.abs(n-i)==Math.abs(array[n] - array[i])
if(Math.abs(n-i)==Math.abs(array[n] - array[i])||array[i]==array[n]) {
return false;
}
}
return true;
}
/**
*note 打印数组
*/
private void print() {
for(int i=0;i<MAX ;i++) {
System.out.print(array[i] + "");
}
System.out.println();
}
}