八皇后问题

问题介绍:

 解决思路:

/**
 * 八皇后问题:解决思路:递归
 * 1.  第一个皇后先放在第一行第一列
 * 2.   第二个皇后放在第二行第一列,然后判断是否合理,如果false,那就继续放在第二列,第三列....一次把所有的列都放完,找到合适的位置为止
 * 3.   继续找第三个皇后,还是按照第一列、第二列....一直到第八个皇后也能放在一个不冲突的位置,算是找到一个正确的解法
 * 4.   当得到一个正确的解法时,在栈回退到上一个栈时,就会开始回溯,即将第一个皇后,放到第一列所有的正确解,全部找到
 * 5.   然后回头继续第一个皇后放到第二列,后面的继续循环执行1、2、3、4的步骤
 */

递归的调用机制(以一个简单案列为例):

 代码实现:

package com.Exer2101.java;

/**
 * 八皇后问题:解决思路递归
 * 1.  第一个皇后先放在第一行第一列
 * 2.   第二个皇后放在第二行第一列,然后判断是否合理,如果false,那就继续放在第二列,第三列....一次把所有的列都放完,找到合适的位置为止
 * 3.   继续找第三个皇后,还是按照第一列、第二列....一直到第八个皇后也能放在一个不冲突的位置,算是找到一个正确的解法
 * 4.   当得到一个正确的解法时,在栈回退到上一个栈时,就会开始回溯,即将第一个皇后,放到第一列所有的正确解,全部找到
 * 5.   然后回头继续第一个皇后放到第二列,后面的继续循环执行1、2、3、4的步骤
 */
public class EightQueens {
    private int max = 8;    //边界
    private int []arr = new int[max];    //用一维数组表示。 数组下标+1 ==行数 , 列数为下表对应的数+1
    public static int count =0;    //用于记录次数
    public static int JudgeCount =0;//用于记录判断次数


    public static void main(String[] args) {
        EightQueens eq = new EightQueens();
        eq.check(0);
        System.out.printf("总共有%d种",count);
        System.out.printf("\n总共判断%d次",JudgeCount);

    }
    //打印位置
    public void print(){
        count++;
        for(int i=0;i<max;i++){
            System.out.print(arr[i] + " ");
        }
        System.out.println();
    }

    //给一个方法,用于放置第n个皇后
    public void check(int n){
        if(n==max){
            print();
            return;
        }
        //如果还未到第八行就继续添加,一共放八个
        for(int i=0;i< max;i++){
            arr[n] = i;//从每一行的第一个位置开始判断
            if(judge(n)){//判断当前皇后的位置
                //如果判读为真,那么就说明位置合理,递归继续添加
                check(n+1);
            }
            //如果judge判断的是false,那么就需要执行i++;然后回到arr[n] = i;
            // 此时i= i+1,皇后位置向后移
        }

    }

    //首先给一个方法,用于判断第n行的皇后是否位置合理
    public boolean judge(int n){
        JudgeCount++;
        for(int i=0;i<n;i++){
            //判读是否在同一列,同一斜线上,如果是就返回false
            if(arr[i] ==arr[n]|| Math.abs(n-i)==Math.abs(arr[n]-arr[i])) {
                return false;
            }
        }
        return true;
    }
}

        参考:尚硅谷《数据结构与算法》

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Allen_5210

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值