八皇后问题_枚举 (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;
    }
}
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值