题目来源
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))