zoukankan      html  css  js  c++  java
  • [leetcode]52. N-Queens II N皇后

    The n-queens puzzle is the problem of placing n queens on an n×n chessboard such that no two queens attack each other.

    Given an integer n, return the number of distinct solutions to the n-queens puzzle.

    Example:

    Input: 4
    Output: 2
    Explanation: There are two distinct solutions to the 4-queens puzzle as shown below.
    [
     [".Q..",  // Solution 1
      "...Q",
      "Q...",
      "..Q."],
    
     ["..Q.",  // Solution 2
      "Q...",
      "...Q",
      ".Q.."]
    ]

    题意:

    code

     1 class Solution {
     2    private int count; // 解的个数
     3     // 这三个变量用于剪枝
     4     private boolean[] columns;   // 表示已经放置的皇后占据了哪些列
     5     private boolean[] main_diag; // 占据了哪些主对角线
     6     private boolean[] anti_diag; // 占据了哪些副对角线
     7 
     8 
     9     public int totalNQueens(int n) {
    10         this.count = 0;
    11         this.columns = new boolean[n];
    12         this.main_diag = new boolean[2 * n - 1];
    13         this.anti_diag = new boolean[2 * n - 1];
    14 
    15         int[] C = new int[n]; // C[i]表示第i行皇后所在的列编号
    16         dfs(C, 0);
    17         return this.count;
    18     }
    19 
    20     void dfs(int[] C, int row) {
    21         final int N = C.length;
    22         if (row == N) { // 终止条件,也是收敛条件,意味着找到了一个可行解
    23             ++this.count;
    24             return;
    25         }
    26 
    27         for (int j = 0; j < N; ++j) {  // 扩展状态,一列一列的试
    28             final boolean ok = !columns[j] &&
    29                     !main_diag[row - j + N - 1] &&
    30                     !anti_diag[row + j];
    31             if (!ok) continue;  // 剪枝:如果合法,继续递归
    32             // 执行扩展动作
    33             C[row] = j;
    34             columns[j] = main_diag[row - j + N - 1] =
    35                     anti_diag[row + j] = true;
    36             dfs(C, row + 1);
    37             // 撤销动作
    38             // C[row] = -1;
    39             columns[j] = main_diag[row - j + N - 1] =
    40                     anti_diag[row + j] = false;
    41         }
    42     }
    43 }
  • 相关阅读:
    android之sharedpreference的两种使用方法
    andoird软件开发之一个记录账号密码的APP--bmob后台
    Android群英传笔记系列三 view的自定义:实现一个模拟下载
    android之文件操作——读取assets和raw文件下的内容
    fragment与viewPaper的使用
    Android之静态和动态加载Fragment
    Swift可选类型
    swift中的类型转化
    SDAutoLayerOut
    github 使用教程
  • 原文地址:https://www.cnblogs.com/liuliu5151/p/9810274.html
Copyright © 2011-2022 走看看