Java八皇后问题

目的:计算出八皇后的所有摆法!

package com.dl;

public class QueenTest {
    //定义一个max表示有多少个皇后
    int max = 8;
    /*1.这里采用一位数组来保存皇后的位置
     * 解释:
     *例如数组array = {1,2,3,4,5,6,7,8}。
     *array[0] = 1; ===> 第一个皇后,在第一行第一列的位置有一个皇后
     *array[i] = value ====>皇后的坐标就是 (i+1,value)
     * 
     */
    int[] array = new int[max];
    static int count = 0;
    
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        QueenTest queen = new QueenTest();
        queen.putQueen(0);
        System.out.println(count);
    }
    
    /**
     * 此方法用来摆放皇后。
     * n表示当前是第几个皇后
     * @param n
     */
    public void putQueen(int n) {
        //先判断是否已经摆放完毕
        if(n==max) {
            //打印8个皇后的位置
            print();
            count++;
            return;
        }
        
        //一次放入皇后,并判断有没有冲突
        for(int i = 0;i < max;i++) {
            //每次放皇后的时候,首先都把皇后放到行的第一列位置
            array[n] = i;
            //判断当前位置是否右冲突
            if(checkLocation(n)) {
                //如果不冲突就接着放下一个皇后
                putQueen(n+1);
            }
        }
    }
    
    
    /**
     * 此方法用来检查当前皇后摆放的位置是否正确
     * n表示是第几个皇后
     * @param n
     * @return
     */
    public boolean checkLocation(int n) {
        for(int i = 0;i<n;i++) {
            //检查当前位置的皇后和之前摆放的皇后的位置是否在同一行,同一列,同一条斜线上
            
            /*
             *这里解释用到的方法
             *1.检查是否在同一行。用 i==n 如果结果为true则表明,两个皇后在同一行
             *
             *2.检查是否在同一列。用array[i]==array[n] 如果结果为true,则表明两个皇后在同一列上
             * 
             *3.检查是否在同一条斜线上面。这里用到来数学上的斜率=1的知识。即:|(i-n)|==|(array[i]-array[n])|.如果二者的绝对值相等,则表明在同一条斜线上面
             * 
             */
            
            if((i==n) || (array[i]==array[n]) || (Math.abs(i-n)==Math.abs(array[i]-array[n]))) {
                return false;
            }
        }
        return true;
    }
    
    //写一个方法,可以将皇后摆放的位置输出
    private void print() {
        for (int i = 0; i < array.length; i++) {
            System.out.print(array[i] + " ");
        }
        System.out.println();
    }

}
 

猜你喜欢

转载自blog.csdn.net/weixin_45634682/article/details/112195042