当前位置:   article > 正文

N皇后问题(Java深度优先递归解法)_n皇后问题java

n皇后问题java
  1. 问题描述

N皇后问题是在N×N的棋盘上放置N个皇后,任意两个皇后不在同一行、同一列和同一斜线。

  1. 解题思路

对于N×N棋盘上的点,第一行的点比较特殊,因为我们会以他们为根去向下搜索。如下

上图中,0图的解数仅与它的子节点有关(0的另外两个子节点未画出);图1的解的数量也仅与它的子节点2、3的解数有关;第四层节点的解数为1。根据这个原理可以对每个节点设计递归函数hasSolution(),其返回值为该节点的解的个数。

  1. 代码

3.1定义一个类Location表示棋子位置

3.2定义isOK(ArrayList<Location> board, Location location)判断放入当前位置的棋子是否符合要求

3.3定义int hasSolution(Location location, int n,ArrayList<Location> board)求对于给定棋盘的当前位置的解数;

3.4定义queens(int n)求n个皇后的解数。函数中调用 hasSolution求得棋盘第一行每个位置的解数,然后求和得到最终结果

  1. package com.xiexun.Solutions;
  2. import java.util.*;
  3. public class Solution4 {
  4. class Location {
  5. public int x;
  6. public int y;
  7. public Location() {
  8. }
  9. public Location(int x, int y) {
  10. this.x = x;
  11. this.y = y;
  12. }
  13. @Override
  14. public int hashCode() {//hashcode必须重写
  15. return Objects.hash(x, y);
  16. }
  17. }
  18. static boolean isOK(ArrayList<Location> board, Location location) {
  19. if (board.size() == 0) return true;//棋盘没有棋子,一定为真
  20. boolean flag = true;
  21. for (int i = 0; i < board.size(); i++) {
  22. if (location.x == board.get(i).x ||//同一行
  23. location.y == board.get(i).y ||//同一列
  24. Math.abs(location.x - board.get(i).x) == Math.abs(location.y - board.get(i).y)) {//同一斜线
  25. flag = false;
  26. }
  27. }
  28. return flag;
  29. }
  30. public int hasSolution(Location location, int n,ArrayList<Location> board) {
  31. if (location.x == n - 1) return 1;//location处于最底层
  32. else {
  33. board.add(location);//向棋盘添加当前位置;此时location一定合法,因为只有合法才会执行hasSolution()
  34. int thisSolution=0;
  35. Location l = new Location();
  36. for (int i = 0; i < n; i++) {
  37. l.x = location.x + 1;
  38. l.y = i;
  39. if(isOK(board,l)){//如果将l代表的位置加入棋盘可行的话
  40. thisSolution+=hasSolution(l,n,board);//该节点的解数等于它所以可行的子节点的解数之和
  41. }
  42. }
  43. board.remove(location);//当前节点的解数已经求出;将当前位置的棋子移除棋盘
  44. return thisSolution;
  45. }
  46. }
  47.     public int queens(int n) {
  48.     ArrayList<Location> board = new ArrayList<>();//定义棋盘
  49.     Stack<Location> possibleQi = new Stack<>();
  50.    
  51.     //加入第一行的所有位置到 possibleQi
  52.     for (int i = 0; i < n; i++) {
  53.     Location l = new Location(0, i);
  54.     possibleQi.add(l);
  55.     }
  56.    
  57.     int n_Solution = 0;
  58.    
  59.     for(Location l:possibleQi){
  60.     n_Solution+=hasSolution(l,n,board);//对于当前位置的棋子和给定的棋盘、n,求当前位置棋子存在的解数
  61.     }
  62.     return n_Solution;
  63.     }
  64.    
  65. }

3.5定义main函数执行queens(n)

  1. import java.util.Scanner;
  2. public class App {
  3. public static void main(String[] args) {
  4. Solution4 s = new Solution4();
  5. Scanner scanner=new Scanner(System.in);
  6. int n = scanner.nextInt();
  7. System.out.println(s.queens(n));
  8. }
  9. }
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/笔触狂放9/article/detail/633271
推荐阅读
相关标签
  

闽ICP备14008679号