八皇后问题

思路分析

1) 第一个皇后先放第一行第一列

2) 第二个皇后放在第二行第一列、然后判断是否OK[即判断是冲突], 如果不OK,继续放在第二列、第三列、依次把所有列都放完,找到一个合适

3) 继续第三个皇后,还是第一列、第二列……直到第8个皇后也能放在一个不冲突的位置,算是找到了一个正确解

4) 当得到一个正确解时,在栈回退到上一个栈时,就会开始回溯,即将第一个皇后,放到第一列的所有正确解,全部得到.

(栈递归完成后,会返回上一个栈,根据上一次的结果继续计算)

5) 然后回头继续第一个皇后放第二列,后面继续循环执行 1,2,3,4的步骤

 

package recursion;

public class Queue8 {
  /*1) 第一个皇后先放第一行第一列
    2) 第二个皇后放在第二行第一列、然后判断是否OK[即判断是冲突], 如果不OK,继续放在第二列、第三列、依次把所有列都放完,找到一个合适
    3) 继续第三个皇后,还是第一列、第二列……直到第8个皇后也能放在一个不冲突的位置,算是找到了一个正确解
    4) 当得到一个正确解时,在栈回退到上一个栈时,就会开始回溯,即将第一个皇后,放到第一列的所有正确解,全部得到.
    5) 然后回头继续第一个皇后放第二列,后面继续循环执行 1,2,3,4的步骤
*/
    int max = 8;//一共8个皇后
    int[] array = new int[max];

    static int count = 0;
    static int judgeCount = 0;
    public static void main(String[] args) {
        //测试一把 , 8皇后是否正确
        Queue8 queue8 = new Queue8();
        queue8.check(0);
        System.out.printf("一共有%d解法", count);
        System.out.printf("一共判断冲突的次数%d次", judgeCount); // 1.5w

    }
    //放置第n个皇后
    private void  check(int n ){

        if( n == max){
            print();
            return;
        }
        else{
            //依次放入,判断是否有冲突
            for(int i = 0; i < max;i++){
                //先把当前这个皇后 n , 放到该行的第1列
                //先从第一列试
                array[n]  = i ;
                //判断放置当前第n个皇后是否冲突
                if(judge(n)){//不冲突
                    check(n+1);//接着放下一个皇后
                    /*比如第一个正确摆法确定了,最后一个皇后位置在i == 3,此时return返回到check(n+1);这里
                    * 此时if语句块中代码执行完,接着for循环,此时 i == 3 < max
                    * i++ , i == 4 判断不冲突 ,然后再返回到check(n+1);这里
                    * i++ 直到最后一个八皇后没有合适的位置,再返回到上一层,即倒数第二个八皇后
                    * 一直重复,直到放在第一列的所有正确解,全部得到.
                    *
                    * 然后再从第二个位置开始,重复以上步骤*/
            }
                //如果冲突的话,就试下一个位置,执行 array[i]  = n ;
            }
        }
    }

    //判断该位置第n个皇后与之前n-1个皇后是否冲突
    private boolean judge(int n){
        for(int i = 0;i < n;i++){
            judgeCount++;
            // 说明
            //1. array[i] == array[n]  表示判断 第n个皇后是否和前面的n-1个皇后在同一列
            //2. Math.abs(n-i) == Math.abs(array[n] - array[i]) 表示判断第n个皇后是否和第i皇后是否在同一斜线
            // n = 1  放置第 2列 1 n = 1 array[1] = 1
            // Math.abs(1-0) == 1  Math.abs(array[n] - array[i]) = Math.abs(1-0) = 1
            //3. 判断是否在同一行, 没有必要,n 每次都在递增
            if(array[n] == array[i] || Math.abs(array[n] - array[i]) == Math.abs(n - i)){
                return false;
            }
        }
        return  true;
    }
    private void print() {
        count++;
        for (int i = 0; i < array.length; i++) {
            System.out.print(array[i] + " ");
        }
        System.out.println();
    }
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
大学生就业服务平台管理系统按照操作主体分为管理员和用户。管理员的功能包括学生档案管理、字典管理、试卷管理、试卷选题管理、试题表管理、考试记录表管理、答题详情表管理、错题表管理、法律法规管理、法律法规收藏管理、法律法规留言管理、就业分析管理、论坛管理、企业管理、简历管理、老师管理、简历投递管理、新闻资讯管理、新闻资讯收藏管理、新闻资讯留言管理、学生信息管理、宣传管理、学生管理、职位招聘管理、职位收藏管理、招聘咨询管理、管理员管理。用户的功能等。该系统采用了Mysql数据库,Java语言,Spring Boot框架等技术进行编程实现。 大学生就业服务平台管理系统可以提高大学生就业服务平台信息管理问题的解决效率,优化大学生就业服务平台信息处理流程,保证大学生就业服务平台信息数据的安全,它是一个非常可靠,非常安全的应用程序。 管理员权限操作的功能包括管理新闻信息,管理大学生就业服务平台信息,包括考试管理,培训管理,投递管理,薪资管理等,可以管理新闻信息。 考试管理界面,管理员在考试管理界面中可以对界面中显示,可以对考试信息的考试状态进行查看,可以添加新的考试信息等。投递管理界面,管理员在投递管理界面中查看投递种类信息,投递描述信息,新增投递信息等。新闻信息管理界面,管理员在新闻信息管理界面中新增新闻信息,可以删除新闻信息。新闻信息类型管理界面,管理员在新闻信息类型管理界面查看新闻信息的工作状态,可以对新闻信息的数据进行导出,可以添加新新闻信息的信息,可以编辑新闻信息信息,删除新闻信息信息。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值