Leetcode#51 N-Queens
经典的8皇后问题变形版
当然也是用经典的8皇后问题解法的变形版咯(仿照"位运算求解8皇后问题")
row:当前是第几行
col:皇后所在的列的情况
left:左上角禁位(因为我是从下向上迭代的)
right:右上角禁位(因为我是从下向上迭代的)
代码:
1 vector<vector<string> > result; 2 vector<string> buffer; 3 4 void solve(int row, vector<bool> &col, vector<bool> left, vector<bool> right) { 5 if (row == 0) { 6 result.push_back(buffer); 7 return; 8 } 9 10 // 计算当前行可以放置皇后的位 11 vector<bool> avail(col.size(), false); 12 for (int i = 0; i < col.size(); i++) 13 avail[i] = !(col[i] || left[i] || right[i]); 14 15 // 计算上一行的左右禁位 16 for (int i = 0; i < col.size() - 1; i++) 17 left[i] = left[i + 1]; 18 left[col.size() - 1] = false; 19 for (int i = col.size() - 1; i > 0; i--) 20 right[i] = right[i - 1]; 21 right[0] = false; 22 23 // 尝试、回溯 24 for (int i = 0; i < col.size(); i++) { 25 if (!avail[i]) 26 continue; 27 col[i] = true; 28 if (i > 0) left[i - 1] = true; 29 if (i < col.size() - 1) right[i + 1] = true; 30 buffer.push_back(string(i, '.') + "Q" + string(col.size() - i - 1, '.')); 31 solve(row - 1, col, left, right); 32 buffer.pop_back(); 33 if (i > 0) left[i - 1] = false; 34 if (i < col.size() - 1) right[i + 1] = false; 35 col[i] = false; 36 } 37 }