Java实现8皇后算法

 八皇后是一道很具典型性的题目。它的基本要求是这样的:在一个8*8的矩阵上面放置8个物体,一个矩阵点只允许放置一个物体,任意两个点不能在一行上,也不能在一列上,不能在一条左斜线上,当然也不能在一条右斜线上。

    初看到这道题目,大家的第一印象是遍历,但是经过实践之后发现遍历其实不好写,而且复杂度很低。不仅需要遍历8*8*8*8*8*8*8*8*8 = 2^24次数据,还要判断各种条件,实际的计算复杂度还要比较这个高。其实我们仔细看一看,这中间很多的计算其实很多是不需要的,因为如果我们在某一行没有可以插入的数据的话,那么这后面的行其实就不用考虑了。也就是说,我们只有在保证前面 插入的物体都合法有效的情况下,才能进行下一次的物体插入。无谓的遍历只会是无用功。

   那么,我们应该怎么做呢?其实步骤不太难:

    (1)在第n行寻找可以插入的位置,中间涉及到位置合法性的判断

    (2)如果没有可以插入的位置,返回

    (3)如果有可以插入的位置, 插入数据。此时再判断是否已经是最后一行,如果是,打印输出返回;反之继续对下一行数据进行试探处理。

 写法如下

public static int num = 0;//累计方案
public static final int MAXQUEEN = 8;
public static int[] cols = new int[MAXQUEEN];//定义cols数组,表示8列棋子皇后摆放的位置
public void FromJava() {
    getCount (0);
}
   public void getCount(int n){
       boolean  [] rwn =new boolean[MAXQUEEN];
       for (int m =0;m<n;m++){
           rwn[cols[m]]=true;
           int d =n-m ;
           if (cols[m]-d>=0){
               rwn[cols[m]-d]=true;
           }

           if (cols[m]+d<MAXQUEEN-1){
               rwn[cols[m]+d]=true;
           }

       }

       for ( int i=0;i<MAXQUEEN;i++) {
           if (rwn[i]) {
               continue;
           }
           cols[n]=i;

           if (n<MAXQUEEN-1){
               getCount(n+1);
           }else {
               num++ ;
               printQueen();
           }
       }

   }
private void printQueen() {
    System.out.println("第"+num+"种方案");
    for(int i = 0;i<MAXQUEEN;i++){
        for(int j = 0;j<MAXQUEEN;j++){
            if(i == cols[j]){
                System.out.print("0 ");
            }else{
                System.out.print("+ ");
            }
        }
        System.out.println();
    }
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值