• Java学习之八皇后


    递归的第三个实际案例:八皇后

    老师给的思路:

    //1.第一个皇后先放第一行第一列;
        //2.第二个皇后放在第二行第一列、然后判断是否 OK,
        //如果不 OK,则尝试放在第二列、第三列…,直到找到一个合适的位置;
        //3.继续放置第三个皇后,还是第一列、第二列…,直到找到一个合适的位置;
        //4.依次循环下去,直到第 8 个皇后也能放在一个不冲突的位置,就算是找到了一个正确解;
        //5.当得到一个正确解时,在栈回退到上一个栈时,就会开始回溯。本次回溯之后,
        //会即将第一个皇后放到第一列前提下的所有正确解全部得到;
        //6.然后回头从 1 开始,第一个皇后放到第一行第二列,后面继续循环执行 2、3、4 的步骤,
        //直至第一个皇后将第一行的所有列都放置过。至此,便得到了八皇后问题的所有放置解法。

    我自己的理解

        //创建一个一维数组,index+1表示第(index + 1)个皇后在第(index + 1)行,
        //arr[index] = 3;表示这个皇后在第4列
        //基本思路:假定arr[0] = 0;即第一个皇后在第一列,第二个皇后在第二行即arr[1]
        //判断标准:如果:arr[0] = arr[1],那么表示两个皇后在同一列,
        //如果|arr[1]-arr[0]| = |1-0|;表示两个皇后在同一斜线上
        //假如arr[0] = 7,arr[1] = 6;判断斜线:|0-1| = |7-6|;这个时候就需要取绝对值,绝对值是非负数

    第一步:

    编写输出算法,代码:

    1. int arr[] = new int[8];
    2. //输出算法
    3. public void print(){
    4. for(int i = 0; i < arr.length; i++){
    5. System.out.print(arr[i] + " ");
    6. }
    7. System.out.println();
    8. }

    第二步:

    编写判断是否冲突的代码

    1. public boolean judge(int index){
    2. for(int i = 0; i < index; i++){//判断和之前的index个皇后是否冲突
    3. if(arr[i] == arr[index] || Math.abs(arr[index]-arr[i]) == Math.abs(index -i)){
    4. return false;
    5. }
    6. }
    7. return true;//必须放在for循环外部,
    8. }

    放在for循环外部的原因:假如是第7个皇后,必须判断完前六个皇后都不冲突再返回true

    第三步:

    放置算法:即调用方法,递归

    1. //放置算法,即在棋盘中放置第几个皇后
    2. public void put(int index){
    3. //首先判断index是否等于8
    4. if(index == 8){//index等于8的时候,即第9个棋子,已经完成了8个棋子的放置
    5. print();//调用输出算法
    6. }else{
    7. for(int i = 0; i < 8; i++){
    8. arr[index] = i;//
    9. if(judge(index)){//如果返回true则继续判断
    10. put(index + 1);
    11. }
    12. }
    13. }
    14. }

    完整代码

    1. public class QueenTest{
    2. public static void main(String[] args){
    3. T t1 = new T();
    4. t1.put(0);
    5. }
    6. }
    7. class T{
    8. int arr[] = new int[8];
    9. //输出算法
    10. public void print(){
    11. for(int i = 0; i < arr.length; i++){
    12. System.out.print(arr[i] + " ");
    13. }
    14. System.out.println();
    15. }
    16. //判断算法
    17. public boolean judge(int index){
    18. for(int i = 0; i < index; i++){//判断和之前的index个皇后是否冲突
    19. if(arr[i] == arr[index] || Math.abs(arr[index]-arr[i]) == Math.abs(index -i)){
    20. return false;
    21. }
    22. }
    23. return true;//必须放在for循环外部,
    24. }
    25. //放置算法,即在棋盘中放置第几个皇后
    26. public void put(int index){
    27. //首先判断index是否等于8
    28. if(index == 8){//当index等于8的时候,即第9个棋子,已经完成了8个棋子的放置
    29. print();//调用输出算法
    30. }else{
    31. for(int i = 0; i < 8; i++){
    32. arr[index] = i;//
    33. if(judge(index)){//如果返回true则继续判断
    34. put(index + 1);
    35. }
    36. }
    37. }
    38. }
    39. }

    简单的内存分析图

    统计共有多少种解法的代码

    1. public class QueenTimes{
    2. public static void main(String[] args){
    3. int count = 0;
    4. T t1 = new T();
    5. count = t1.put(0);
    6. System.out.println("八皇后一共有" + count + "种解法");
    7. }
    8. }
    9. class T{
    10. int arr[] = new int[8];
    11. int count = 0;
    12. //输出算法
    13. public void print(){
    14. for(int i = 0; i < arr.length; i++){
    15. System.out.print(arr[i] + " ");
    16. }
    17. System.out.println();
    18. count ++;
    19. }
    20. //判断算法
    21. public boolean judge(int index){
    22. for(int i = 0; i < index; i++){//判断和之前的index个皇后是否冲突
    23. if(arr[i] == arr[index] || Math.abs(arr[index]-arr[i]) == Math.abs(index -i)){
    24. return false;
    25. }
    26. }
    27. return true;//必须放在for循环外部,
    28. }
    29. //放置算法,即在棋盘中放置第几个皇后
    30. public int put(int index){
    31. //首先判断index是否等于8
    32. if(index == 8){//当index等于8的时候,即第9个棋子,已经完成了8个棋子的放置
    33. print();//调用输出算法
    34. }else{
    35. for(int i = 0; i < 8; i++){
    36. arr[index] = i;//
    37. if(judge(index)){//如果返回true则继续判断
    38. put(index + 1);
    39. }
    40. }
    41. }
    42. return count;
    43. }
    44. }

  • 相关阅读:
    22 河南省赛 - H.旋转水管(暴搜)
    LeetCode[112]路径总和
    基于微信小程序的个人健康数据管理平台设计与实现(源码+lw+部署文档+讲解等)
    ASEMI整流桥DB307S参数,DB307S规格,DB307S封装
    快速开发微信小程序之一登录认证
    Linux管道与重定向
    2022 年金九银十必问的 1000 道 Java 面试题及答案整理
    Python中套接字实现服务端和客户端3-3
    从 SAN 到 SDS,XSKY 持续助力中英人寿存储架构革新
    CEO问CIO:数字化运营到底要解决什么问题?
  • 原文地址:https://blog.csdn.net/wjkqq0921/article/details/127310306