N皇问题。
将N*N的点阵看做平面直角坐标系,当有皇后在同一直线上时出现冲突。
用vector<int> vt(n)记录n行的皇后纵坐标,即第i行皇后的坐标应为 (i, vt[i]).
考察第i和第j行的皇后,在平面直角坐标系中(左上角为坐标原点),会有三种冲突情况:
1. 同属某条斜率为1的直线(左上到右下方向):i-vt[i] == j-vt[j]
2. 同属某条斜率为-1的直线:i+vt[i] == j+vt[j]
3. 同属某条垂直x轴的直线:vt[i] == vt[j]
从而可以利用这三个约束条件进行递归解题。
代码:
class Solution
{
public:
vector<vector<string> > solveNQueens(int n)
{
vector<int> vt(n, 0);
vector<vector<string> > ret;
gao(vt, 0, n);
for (size_t i = 0; i < record.size(); ++ i)
{
vector<string> board;
for (size_t j = 0; j < n; ++ j)
{
string line(n, '.');
line[record[i][j]] = 'Q';
board.push_back(line);
}
ret.push_back(board);
}
return ret;
}
private:
vector<vector<int>> record;
void gao(vector<int>& vt, int row, int n)
{
if (row == n)
{
record.push_back(vt);
return ;
}
for (int j = 0; j < n; ++ j)
{
bool legal = true;
for (int i = 0; i < row; ++ i)
{
if (vt[i]==j || i-vt[i]==row-j || i+vt[i]==row+j)
{
legal = false;
break;
}
}
if (legal == true)
{
vt[row] = j;
gao(vt, row+1, n);
}
}
}
};