八皇后问题_枚举 (Java)

暴力枚举法解决八皇后问题,问题的关键在于如何记录皇后的位置,以及如何判断他们是不是按要求摆放。

1.首先我们可以利用一位数组来表示皇后的位置(如a[1] = 2表示第一列第二行有一个皇后),当枚举各种摆放位置来更新这个一维数组。

2.其次,要如何去判断他们是否摆放合适呢,还是对数组里存的值进行一次判断,首先我们可以确定的是每一列只可能有一个皇后,所以我们先判断他们的行是否有重复a[i] ==a[j]则表示重复了,其次再比较他们的斜列是否重复,abs(a[i]-a[j]) == i - j表示重复。在方法中遍历的时候切记“j <= i-1”而非小于,仅仅一个等号,结果可谓天壤之别,一个有180多万种结果,一个有92种。当然后者为正确答案。


public class 八皇后问题_枚举 {
    
    
    //定义棋盘
    static int[][] qipan = new int[9][9];
    public static void main(String[] args) {
    
    
        Queen();
    }
    static void Queen(){
    
    
        //定义一个标记数组 a[1] = 2表示第一列第二行有一个皇后
        int[] a = new int[9];
        //定义计数器
        int count = 0;
        int i;
            for (a[1] = 1;a[1] < 9;a[1]++)
                for (a[2] = 1;a[2] < 9;a[2]++)
                    for (a[3] = 1;a[3] < 9;a[3]++)
                        for (a[4] = 1;a[4] < 9;a[4]++)
                            for (a[5] = 1;a[5] < 9;a[5]++)
                                for (a[6] = 1;a[6] < 9;a[6]++)
                                    for (a[7] = 1;a[7] < 9;a[7]++)
                                        for (a[8] = 1;a[8] < 9;a[8]++){
    
    
                                            if(!cover(a))
                                                continue;
                                            else{
    
    
                                                count++;
                                                qipan[a[1]][1] = 1;
                                                qipan[a[2]][2] = 1;
                                                qipan[a[3]][3] = 1;
                                                qipan[a[4]][4] = 1;
                                                qipan[a[5]][5] = 1;
                                                qipan[a[6]][6] = 1;
                                                qipan[a[7]][7] = 1;
                                                qipan[a[8]][8] = 1;
                                                for (i = 1;i < 9;i++){
    
    
                                                    for (int j = 1;j < 9;j++){
    
    
                                                        System.out.print(qipan[i][j]+" ");
                                                        qipan[i][j] = 0;
                                                    }
                                                    System.out.println();
                                                }
                                                System.out.println();
                                            }
                                    }
                                    System.out.println("一共有"+count+"种方法");
    }
    static boolean cover(int a[]){
    
    
        int i = 2;
        int j = 1;
        boolean res = true;

        for(i = 2;i < 9;i++){
    
    
            for(j = 1;j <= i-1;j++){
    
    
                if((a[i] == a[j]) || ((Math.abs(a[i]-a[j])) == i -j)){
    
    
                    res = false;
                    break;
                }
            }
            if(!res)
                break;
        }
        return res;
    }
}

猜你喜欢

转载自blog.csdn.net/baldicoot_/article/details/105537473