算法与数据结构-03-八皇后问题(递归回溯)

不管现实多么惨不忍睹,都要持之以恒地相信,这只是黎明前短暂的黑暗而已。不要惶恐眼前的难关迈不过去,不要担心此刻的付出没有回报,别再花时间等待天降好运。真诚做人,努力做事!你想要的,岁月都会给你。算法与数据结构-03-八皇后问题(递归回溯),希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com,来源:原文

思路:

找出八皇后有多少种摆法,其实就是暴力穷举,思路如下:

  1. 第一个个皇后先放第一行第一列
  2. 第二个皇后放在第二行第一列,然后判断是否符合规则,如果不符合规则,则继续放在第 2 列,依次把所有列都放完,找到一个合适的列(某一遍)
  3. 继续第 3 个皇后,直到 8 个皇后都放到了棋盘上,并且没有违反规则,就算一个解答
  4. 当得到一个正确解时,在栈回退到上一个栈时,就会开始回溯,即将第一个皇后放在第一列的所有正确解全部拿到
  5. 然后回头继续第一个皇后放第二列,后面继续循环执行前面 4 步

理论上应该创建一个二维数组来表示棋盘,但是实际上可以通过算法,用一个一维数组即可解决问题. arr[8] = {0 , 4, 7, 5, 2, 6, 1, 3},这个是存储结果,数组下标表示第几行,对应的值则为在那一列上摆放着

 

 

 

代码:

 1 package sgq0321;
 2 
 3 import java.util.Arrays;
 4 
 5 /*
 6  * @Author: sgq
 7  * @Date: 2022/3/21 11:16
 8  * @Description:
 9  */
10 public class Queen8 {
11      int max=8;
12      int[] arr=new int[max];
13      int counter=0;
14 
15     public static void main(String[] args) {
16         Queen8 queen8 = new Queen8();
17         queen8.check(0);
18     }
19 
20     public void check(int n){
21         // 如果n==9 停止递归,成功生成一种方案
22         if(n==max){
23             counter++;
24             print();
25             return;
26         }
27         // 否则继续查找合理方案
28         for (int i = 0; i < max; i++) {
29             arr[n]=i;
30             if(judge(n)){
31                 check(n+1);
32             }
33         }
34 
35     }
36 
37     // 判断n行放置皇后是否合理(是否与前面n-1行冲突)
38     private boolean judge(int n) {
39         for (int i = 0; i < n; i++) {
40             if(arr[n]==arr[i] || Math.abs(n-i)==Math.abs(arr[n]-arr[i])){
41                 return false;
42             }
43         }
44         return true;
45     }
46 
47     // 打印每次成功的方案
48     public void print(){
49         System.out.print("counter-"+counter+": ");
50         System.out.println(Arrays.toString(arr));
51     }
52 
53 
54 }

 

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/187631.html

(0)
小半的头像小半

相关推荐

极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!