zoukankan      html  css  js  c++  java
  • leetcode 52. N皇后 II

    n 皇后问题研究的是如何将 n 个皇后放置在 n×n 的棋盘上,并且使皇后彼此之间不能相互攻击。

     

    上图为 8 皇后问题的一种解法。

    给定一个整数 n,返回 n 皇后不同的解决方案的数量。

    示例:

    输入: 4
    输出: 2
    解释: 4 皇后问题存在如下两个不同的解法。
    [
     [".Q..",  // 解法 1
      "...Q",
      "Q...",
      "..Q."],

     ["..Q.",  // 解法 2
      "Q...",
      "...Q",
      ".Q.."]
    ]

    来源:力扣(LeetCode)
    链接:https://leetcode-cn.com/problems/n-queens-ii
    著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

    解法同leetcode 51,只是统计个个数而已。

     1 class Solution {
     2     // 按行的方式
     3     private boolean isOk(char[][] res, int i, int j, int n){ // 检测位置(i,j)可不可以放置
     4         if (res[i][j] == 'Q') return false;
     5         // 列 与 行
     6         for (int k = 0; k < n; ++k){
     7             if (k != i && res[k][j] == 'Q')
     8                 return false;
     9             if (k != j && res[i][k] == 'Q')
    10                 return false;
    11         }
    12         // 皇后左上
    13         for (int k = 1; i-k >= 0 && j-k >= 0; ++k)
    14             if (res[i-k][j-k] == 'Q')
    15                 return false;
    16         // 皇后右下
    17         for (int k = 1; i+k < n && j+k < n; ++k)
    18             if (res[i+k][j+k] == 'Q')
    19                 return false;
    20         // 皇后右上
    21         for (int k = 1; i-k >=0 && j+k < n; ++k)
    22             if (res[i-k][j+k] == 'Q')
    23                 return false;
    24         // 皇后左下
    25         for (int k = 1; i+k < n && j-k >= 0; ++k)
    26             if (res[i+k][j-k] == 'Q')
    27                 return false;
    28         return true;
    29     }
    30     // cur:在第cur行放置皇后
    31     // lists:存放不同的放置方案
    32     private int result(int n, char[][] res, int cur){
    33         if (cur == n){
    34             return 1;
    35         }
    36         int cnt = 0;
    37         for (int i = 0; i < n; ++i){
    38             if (isOk(res, cur, i, n)){
    39                 res[cur][i] = 'Q';
    40                 cnt += result(n, res, cur+1);
    41                 res[cur][i] = '.';
    42             }
    43         }
    44         return cnt;
    45     }
    46 
    47 
    48 
    49     private Integer solveNQueens(int n) {
    50         char[][] res = new char[n][n];
    51         /*
    52         .:可以放置皇后
    53         Q:已经放置皇后
    54         -:和已有皇后冲突
    55          */
    56         for (int i = 0; i < n; i++)
    57             for (int j = 0; j < n; j++)
    58                 res[i][j] = '.';
    59         return result(n, res, 0);
    60     }
    61     public int totalNQueens(int n) {
    62         return solveNQueens(n);
    63     }
    64 }
  • 相关阅读:
    Java高级特性 第11节 JUnit 3.x和JUnit 4.x测试框架
    Java高级特性 第10节 IDEA和Eclipse整合JUnit测试框架
    Java高级特性 第9节 Socket机制
    Java面向对象和高级特性 项目实战(一)
    Java高级特性 第8节 网络编程技术
    Java高级特性 第7节 多线程
    二十一、字符串类的创建
    二十二、经典问题解析二
    二十一、C++中的临时对象
    二十、对象的销毁
  • 原文地址:https://www.cnblogs.com/yfs123456/p/11564315.html
Copyright © 2011-2022 走看看