package 递归recursion;
/**
* @author 郑道炫
* @version 1.0
*/
public class bahuanghou {
//定义一个max表示共有多少个皇后
int max =8;
public static int count = 0;
int[]array=new int[max];
public static void main(String[] args) {
//测试一把,8皇后是否正确
bahuanghou bahuanghou = new bahuanghou();
bahuanghou.check(0);//第一个皇后
System.out.println("一共有多少次解法"+count);
}
// 编写一个方法,放置第n+1个皇后
private void check(int n){
if (n==max){//总共8个皇后,放好
print();
return;
}
//依次放入皇后,并判断是否冲突
for (int i = 0; i < max; i++) {
//先把当前这个皇后放到该行的第一列
array[n] = i;
//判断当放置第n+1个皇后到i+1列时,是否冲突
if (judge(n)){
//不冲突要放n+1个皇后
check(n+1);//8个皇后
}
//如果冲突,就继续执行 array【n】 = i;即将第n个皇后,放置在本行得后移的一个位置
}
}
//查看当前我们放置第n个皇后,就去检测该皇后是否和前面已经摆放的皇后冲突
//n表示第n个皇后
private boolean judge(int n){
for (int i = 0; i < n; i++) {
//表示怕暖第n个皇后和第i个皇后是否在斜线
//n=1 放在第二列1 n=1 array[i] = 1
//Math.abs(1-0) == 1 Math.abs(array[n] - array[i]) = Math.abs(1-0) = 1
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.print(array[i]+" ");
}count++;
System.out.println();
}
}
一共有多少次解法92
感想:最难的部分就是for循环下要设立 array【n】= i; 这里 n是皇后个数,i是纵坐标,i从0开始计数,而n从1开始计数。 然后利用其n 进行是否冲突判断,接下来递归n+1,实际上与地图里找路一样,关键在于 array[n]=i结构是否想到,然后利用其n进行递归。
for (int i = 0; i < max; i++) {
//先把当前这个皇后放到该行的第一列
array[n] = i;
//判断当放置第n个皇后到i列时,是否冲突
if (judge(n)){
//不冲突要放n+1个皇后
check(n+1);//8个皇后
}
//如果冲突,就继续执行 array【n】 = i;即将第n个皇后,放置在本行得后移的一个位置
}
}