八皇后问题暴力解决法(介绍代码有说明)
先展示结果:
我这里用的是一维数组来展示的结果
array={7,3,0,2,5,1,6,4}
7的下标为0, 在这里下标+1表示的是第几个皇后也是行的位置,array[n]+1的值就是皇后所在列的位置,即:
0 0 0 0 1 0 0 0
0 0 0 0 0 0 1 0
0 1 0 0 0 0 0 0
0 0 0 0 0 1 0 0
0 0 1 0 0 0 0 0
1 0 0 0 0 0 0 0
0 0 0 1 0 0 0 0
0 0 0 0 0 0 0 1
下面是代码演示:
//定义一个max表示一共有多少皇后
int max = 8;
static int all = 0;
//定义数组,保存皇后放置后位置的结果,比如arr={0,1,2,3,4,5,6,7}
int[] array = new int[max];
public static void main(String[] args) {
//测试
Queue8 queue8 = new Queue8();
queue8.check(0);
System.out.println(all);
}
//特别注意!!!
//每一个check都有for (int i =0; i < max; i++)因此会出现回溯
private void check(int n){
if (n == max){
print();
return;
}
//一次放入皇后判断是否冲突
for (int i =0; i < max; i++){
//先吧当前皇后放到第1列
array[n] = i;
//判断放置第n个皇后到i列时,是否冲突
if (judge(n)){ //不冲突
//接着放置第n个皇后 递归开始
check(n+1);
}
//如果冲突就继续执行array[n] = i;即将第n个皇后,放置在本行的后移一个位置
}
}
/**
* 判断是否符合位置
* @param n 表示第几个皇后
* @return 是否
*/
private boolean judge(int n){
for (int i = 0; i < n; i++){
//说明
//1.array[i] == array[n] 表示判断第n个皇后是否与n-1个皇后处于同一列
//2.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;
}
//写一个方法,可以将皇后位置摆放输出
private void print(){
for (int i = 0; i < array.length; i++){
System.out.printf(array[i] + " ");
}
all++;
System.out.println();
}