[LeetCode]题解(python):052-N-Queens II


题目来源

https://leetcode.com/problems/n-queens-ii/

Follow up for N-Queens problem.

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


题意分析


Input: n

Output: n of number of the result

Conditions:n 皇后问题,但是返回数目


题目思路


上题采用递归方法,这次采用非递归方法做,主要是弄清楚非递归什么时候回溯即可。同上题,采用一维数组存储第i行的位置,然后每一次判断条件也是跟上题一样(一维表示不会同行,board[i] != board[j]表示同列,abs(i- j)!= abs(list[i] - list[j])表示不会同斜线)。

回溯的方法是,如果在本行没找到把row -= 1,然后把board[row] = -1(注意row已经更新了),col = board[row] + 1(从新的一行的已有结果的下一列开始找)

 

row的判断:

当row等于0并且还需要回溯时,即可终止寻找

当row等于n-1时,此时说明有一个答案(前提是这一行已经找到了)


AC代码(Python)


 

 1 __author__ = 'YE'
 2 
 3 class Solution(object):
 4     def totalNQueens(self, n):
 5         """
 6         :type n: int
 7         :rtype: int
 8         """
 9         def check(k, j):
10             for i in range(k):
11                 if board[i] == j or abs(k - i) == abs(board[i] - j):
12                     return False
13             return True
14 
15         board = [-1 for i in range(n)]
16 
17         row = 0
18         col = 0
19         count = 0
20 
21 
22         while row < n:
23             while col < n:
24                 if check(row, col):
25                     board[row] = col
26                     col = 0
27                     break
28                 else:
29                     col += 1
30             if board[row] == -1:
31                 if row == 0:
32                     break
33                 else:
34                     row -= 1
35                     col = board[row] + 1
36                     board[row] = -1
37                     continue
38             if row == n - 1:
39                 count += 1
40                 col = board[row] + 1
41                 board[row] = -1
42                 continue
43             row += 1
44         return count
45 
46 
47 
48 n = 4
49 print(Solution().totalNQueens(n))

 

posted @ 2015-12-28 14:45  loadofleaf  Views(169)  Comments(0Edit  收藏  举报