用的是回溯法
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 |
时间: 2024-11-05 18:28:59