16.java八皇后问题
问题描述:在 8×8 格的国际象棋上摆放八个皇后,使其不能互相攻击,即: 任意两个皇后都不能处于同一行 、同一列或同一斜线上,问有多少种摆法(92)。
思路分析:1) 第一个皇后先放第一行第一列2) 第二个皇后放在第二行第一列、然后判断是否 OK, 如果不 OK,继续放在第二列、第三列、依次把所有列都放完,找到一个合适3) 继续第三个皇后,还是第一列、第二列……直到第 8 个皇后也能放在一个不冲突的位置,算是找到了一个正确解4) 当得到一个正确解时,在栈回退到上一个栈时,就会开始回溯,即将第一个皇后,放到第一列的所有正确解,全部得到.5) 然后回头继续第一个皇后放第二列,后面继续循环执行 1,2,3,4 的步骤
代码如下:
package linkedlist; import java.util.Queue; public class queen { int max=8; int [] array=new int[max]; static int count; public static void main(String args[]){ queen queue=new queen(); queue.check(0); System.out.println(count); } public boolean judge(int n){ for (int i=0;i<n;i++){ if(array[i]==array[n]||Math.abs(i-n)==Math.abs(array[i]-array[n])){ return false; } } return true; } public void check(int n){ if(n==max){ print(); return; } for (int i=0;i<max;i++){ array[n]=i; if(judge(n)){ check(n+1); } } } private void print() { count++; for (int i = 0; i < array.length; i++) { System.out.print(array[i] + " "); } System.out.println(); } }
其实这个回溯以for循环的角度来看会好理解很多,这个问题可以看成八个for循环嵌套。当最里面的for循环执行完毕后会接着执行紧贴着其的那层外层for循环的下一个元素。