【LeetCode】52.N-Queens II

用的是回溯法

 1 class Solution {
 2 public:
 3     int INITIAL = -1000;
 4     // 一维数组a[n]中,下标代表行号,对应里面存的值代表列号。比如a[2] = 4,说明2行4列(0行0列为最开始的行列号)
 5     bool place(int *a, int n, int row, int col)    // 判断第row行第col列可否放置皇后
 6     {
 7         for (int i = 0; i < n; ++i)         // 逐行搜索有无冲突,i代表i行
 8         {
 9             if (a[i] == col || abs(i - row) == abs(a[i] - col))
10                 return 0;
11         }
12         return 1;
13     }
14     
15     int totalNQueens(int n) {
16         int a[n];
17         for (int i =0; i < n; ++i)      // 数组初始化
18             a[i] = INITIAL;
19         int row = 0, col = 0;
20         int sum = 0;        // 有效的N皇后解
21         
22         while (row < n)
23         {
24             while (col < n)     // 对第row行的每一列进行探测,看能否放置皇后
25             {
26                 if (place(a, n, row, col))
27                 {
28                     a[row] = col;
29                     col = 0;
30                     break;      // 此处break表示第row行已经放置好皇后,可以进入到下一行进行搜索
31                 }
32                 else
33                     ++col;
34             }
35             if (a[row] == INITIAL)      // 此时表示第row行没有找到可以放置皇后的位置
36             {
37                 if (row == 0)     // 回溯的终止条件
38                     break;
39                 else
40                 {
41                     --row;
42                     col = a[row] + 1;       // 把上一行的皇后往后移一列(还需判断后移后是否满足条件)
43                     a[row] = INITIAL;
44                     continue;
45                 }
46             }
47             if (row == n - 1)       // 程序能进入此判断内,则说明最后一行找到了皇后的位置,产生一个有效解
48             {
49                 ++sum;
50                 col = a[row] + 1;   // 把这个有效解的位置清除掉,从最后一行、后移一列的位置继续探测
51                 a[row] = INITIAL;
52                 continue;
53             }
54             ++row;
55         }
56         return sum;
57     }
58 };

中间犯了些小问题,这个题目最好在纸上把逻辑写下

9 / 9 test cases passed.
Status: 

Accepted

Runtime: 6 ms
Submitted: 0 minutes ago
posted @ 2015-05-10 10:55  HelloWaston  阅读(158)  评论(0编辑  收藏  举报