leetcode N-Queens II

原创 2013年12月01日 22:53:23

N-Queens II

 Total Accepted: 1560 Total Submissions: 6035My Submissions

Follow up for N-Queens problem.

Now, instead outputting board configurations, return the total number of distinct solutions.


The code similar to I is TLE

class Solution {
 public:
  bool check(vector<vector<int>>& board, int x, int y) {
    int size = board.size(), xx, yy;
    for (int i = 0; i < x; ++i) 
      if (board[i][y])
        return false;
    for (int i = 0; i < size; ++i) 
      if (board[x][i])
        return false;
    for (xx = --x, yy = --y; xx >= 0 && yy >= 0; --xx, --yy) 
      if (board[xx][yy])
        return false;
    for (xx = --x, yy = ++y; xx >= 0 && yy < size; --xx, ++yy) 
      if (board[xx][yy])
        return false;
    return true;
  }
  void dfs(vector<vector<int>>& board, int& count, int start) {
    int size = board.size();
    if (start == board.size()) {
      ++count;
      return;
    }
    for (int i = 0; i < size; ++i) {
      if (check(board, start, i)) {
        board[start][i] = 1;
        dfs(board, count, start + 1);
        board[start][i] = 0;
      }
    }
  }
  int totalNQueens(int n) {
    if (n == 0)
      return 0;
    int res = 0;
    vector<vector<int>> board(n, vector<int>(n, 0));
    dfs(board, res, 0);
    return res;
  }
};
The main problem is that the check function wastes too much time. 

Two ways to avoid this:

1. Use an array to record the position row[i] , col[i](true, false)

2. BIt manipulation

class Solution {
 public:
  unsigned int upperlimit;
  void dfs(int& count, unsigned int row, unsigned int ld, unsigned int rd) {
    if (row == upperlimit)
      ++count;
    unsigned int pos = (row | ld | rd) & upperlimit; // the bit 1 simplify the position can't place the queue any more
    unsigned int p = (~pos) & upperlimit,digit = 0;
    while (p) {
      digit = p - (p & (p - 1)); // Find the rightest 1
      //digit = p&(~p + 1);
      dfs(count, row + digit, (ld + digit) >> 1, (rd + digit) << 1);
      p -= digit;
    }
  }
  int totalNQueens(int n) {
    upperlimit = 0;
    int count = 0;
    for (int i = 0; i < n; ++i)
      upperlimit |= (1<<i);
    dfs(count, 0, 0, 0);
    return count;
  }
};


This is a WA code, find the problem!!!!!!

class Solution {
 public:
  unsigned int upperlimit;
  int res = 0;
  void dfs(unsigned int row, unsigned int ld, unsigned int rd) {
    if (row == upperlimit)
      ++res;
    unsigned int pos = (row | ld | rd) & upperlimit, p = (~pos) & upperlimit, digit;
    while (p) {
      digit = p - p & (p - 1);
      dfs(row + digit, (ld + digit) << 1, (rd + digit) >> 1);
      p -= digit;
    }
  };
  int totalNQueens(int n) {
    for (int i = 0; i < n; ++i)
      upperlimit |= (1 << i);
    res = 0;
    dfs(0, 0, 0);
    return res;  
  }
};



 

leetCode 52.N-Queens II (n皇后问题II) 解题思路和方法

N-Queens II Follow up for N-Queens problem. Now, instead outputting board configurations, ...
  • xygy8860
  • xygy8860
  • 2015年07月13日 14:08
  • 1086

N-Queens II N皇后问题(有几种放法)@LeetCode

是上一题的follow-up,问有总共几种方法。用全局变量易得,但是在java中不能像C++那么方便地用引用或指针传primitive参数。所以我觉得用return value来记录方法数更好! ...
  • hellobinfeng
  • hellobinfeng
  • 2013年11月11日 05:22
  • 3244

【LeetCode-面试算法经典-Java实现】【113-Path Sum II(路径和)】

【113-Path Sum II(路径和II)】【LeetCode-面试算法经典-Java实现】【所有题目目录索引】原题  Given a binary tree and a sum, find al...
  • DERRANTCM
  • DERRANTCM
  • 2015年08月12日 06:23
  • 2491

买卖股票的最佳时机I II III IV

买卖股票的最佳时机I II III IV I假设有一个数组,它的第i个元素是一支给定的股票在第i天的价格。如果你最多只允许完成一次交易(例如,一次买卖股票),设计一个算法来找出最大利润。II假设有一...
  • u010669349
  • u010669349
  • 2017年12月22日 22:47
  • 30

Leetcode 454. 4Sum II 四数之和2 解题报告

1 解题思想首先,这是一道远古之前的题的进化版: Leetcode #18 4Sum 四数之和 解题小节+K-Sum思想 但是我不想说那个题了,因为我也记不住了。。这道题意思就是ABCD四个数组,长...
  • MebiuW
  • MebiuW
  • 2016年11月16日 22:45
  • 2765

LeetCode进阶之路(N-Queens)

The n-queens puzzle is the problem of placing n queens on an n×n chessboard such that no two queens ...
  • yulingkai88
  • yulingkai88
  • 2016年08月19日 22:22
  • 118

leetcode:N-Queens II 的位运算非递归解法

原 Follow up for N-Queens problem. Now, instead outputting board configurations, return the tot...
  • OrthocenterChocolate
  • OrthocenterChocolate
  • 2014年06月28日 14:47
  • 1755

Leetcode 240 Search a 2D Matrix II (二分法和分治法解决有序二维数组查找)

1.问题描述  写一个高效的算法,从一个m×nm\times n的整数矩阵中查找出给定的值,矩阵具有如下特点:    每一行从左到右递增。 每一列从上到下递增。 2. 方法与思路2.1 二分查找法 ...
  • Jeanphorn
  • Jeanphorn
  • 2015年07月23日 20:41
  • 3094

【LeetCode-面试算法经典-Java实现】【219-Contains Duplicate II(包含重复元素II)】

【219-Contains Duplicate II(包含重复元素II)】【LeetCode-面试算法经典-Java实现】【所有题目目录索引】代码下载【https://github.com/Wang-...
  • DERRANTCM
  • DERRANTCM
  • 2015年08月29日 06:36
  • 3247

【每天一道leetcode】1:N-Queens

The n-queens puzzle is the problem of placing n queens on an n×n chessboard such that no two queens ...
  • chenchaofuck1
  • chenchaofuck1
  • 2016年06月25日 16:20
  • 545
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:leetcode N-Queens II
举报原因:
原因补充:

(最多只允许输入30个字)