zoukankan      html  css  js  c++  java
  • 52.N-Queens II

    题目链接:https://leetcode.com/problems/n-queens-ii/description/

    题目大意:返回N皇后的所有解的个数。

    法一:直接用51题的代码,只是返回值变成list.size()即可,代码如下(耗时9ms):

     1     public int solveNQueens(int n) {
     2         int[] res = new int[n];//res的下标表示皇后放置在第几行,res的值表示皇后放置在第几列
     3         List<List<String>> list = new LinkedList<List<String>>();//list存储最终返回的所有解
     4         int[][] vis = new int[3][n + n];//vis标记哪一列,哪条主对角线,哪条副对角线已经放置值
     5         for(int i = 0; i < 3; i++) {//初始化标记数组
     6             for(int j = 0; j < n; j++) {
     7                 vis[i][j] = 0;
     8             }
     9         }
    10         dfs(res, 0, n, list, vis);
    11         
    12         return list.size();
    13     }
    14     
    15     public static void dfs(int[] res, int row, int n, List<List<String>> list, int[][] vis) {
    16         if(row == n) {//如果已经放置完所有的列,则将当前解加入到list中
    17             List<String> listIn = new LinkedList<String>();//先将内置的List赋值
    18             for(int i = 0; i < res.length; i++) {
    19                 String s = "";
    20                 for(int j = 0; j < n; j++) {
    21                     if(j == res[i]) {
    22                         s += "Q";
    23                     }
    24                     else {
    25                         s += ".";
    26                     }
    27                 }
    28                 listIn.add(s);
    29             }
    30             list.add(listIn);//再将内置的list的值加入到要返回的list中
    31             return;
    32         }
    33         for(int col = 0; col < n; col++) {//对于每一行要放置的皇后,col表示当前行可以放置的列
    34             if(vis[0][col] == 0 && vis[1][col + row] == 0 && vis[2][row - col + n] == 0) {//关键判断:不同行,不同列,不同主对角线,不同副对角线
    35                 vis[0][col] = 1;//
    36                 vis[1][col + row] = 1;//副对角线
    37                 vis[2][row - col + n] = 1;//主对角线
    38                 res[row] = col;//存储皇后应该放置的位置
    39                 dfs(res, row + 1, n, list, vis);//递归
    40                 vis[0][col] = 0;
    41                 vis[1][col + row] = 0;
    42                 vis[2][row - col + n] = 0;
    43             }
    44         }
    45     }
    View Code

    法二:将51题的代码改一下,不用再一一赋值给list,而是只用计算解个数即可,代码如下(耗时3ms):

     1     public int solveNQueens(int n) {
     2         int[][] vis = new int[3][n + n];//vis标记哪一列,哪条主对角线,哪条副对角线已经放置值
     3         for(int i = 0; i < 3; i++) {//初始化标记数组
     4             for(int j = 0; j < n; j++) {
     5                 vis[i][j] = 0;
     6             }
     7         }
     8         int res = 0;
     9         res = dfs(0, n, vis, res);
    10         return res;
    11     }
    12     
    13     public static int dfs(int row, int n, int[][] vis, int res) {
    14         if(row == n) {//如果已经放置完所有的列,则将当前解加入到list中
    15             res++;
    16             return res;
    17         }
    18         for(int col = 0; col < n; col++) {//对于每一行要放置的皇后,col表示当前行可以放置的列
    19             if(vis[0][col] == 0 && vis[1][col + row] == 0 && vis[2][row - col + n] == 0) {//关键判断:不同行,不同列,不同主对角线,不同副对角线
    20                 vis[0][col] = 1;//
    21                 vis[1][col + row] = 1;//副对角线
    22                 vis[2][row - col + n] = 1;//主对角线
    23                 res = dfs(row + 1, n, vis, res);//递归
    24                 vis[0][col] = 0;
    25                 vis[1][col + row] = 0;
    26                 vis[2][row - col + n] = 0;
    27             }
    28         }
    29         return res;
    30     }
    View Code
  • 相关阅读:
    改造MFC程序,使原来不支持winsocket的工程支持winsocket
    算术移位和逻辑移位实现分析
    MFC 编辑框中字体大小改变,行高不能改变,只能显示一半的问题,已解决。
    在MFC中,使用控制台Console输出调试信息
    在MFC中使用GDI+的一般方法,以VC6.0编译器为例
    WinForm 实现主程序(exe)与其关联类库(*.dll)分开存放
    Deserializing/Serializing SOAP Messages in C#
    List分页
    ConvertJavaMiliSecondToDateTime
    中文数字大小写转阿拉伯数字
  • 原文地址:https://www.cnblogs.com/cing/p/7749697.html
Copyright © 2011-2022 走看看