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循环的下一个元素。

posted @ 2022-03-30 23:46  水煮小白菜  阅读(79)  评论(0编辑  收藏  举报