主要思想就是递归回溯,一行一行的加,每次确保前边的都满足要求,因此,新加入的一行只需与遍历前边已加入的行,是否满足要求即可
//N-Queens
//一行一行放置使其不冲突 递归回溯
//检查最后一行的皇后,和前边行的是否冲突
bool check(int row, vector<int> Queen)
{
for (int i = 0; i < row; ++i)
{
if (Queen[row]==Queen[i]||abs(Queen[row]-Queen[i])==(row-i))
{
return false;
}
}
return true;
}
//第row行的情况,递归回溯
void iQueen(int n, int row, vector<int>& Queen, vector<vector<string>>& res)
{
if (n <= 0)
return;
if (row == n)
{
vector<string> temp;
string temp1;
for (int i = 0; i < n; ++i)
temp1 += '.';
for (int i=0;i<n;++i)
{
temp1[Queen[i]] = 'Q';
temp.push_back(temp1);
temp1[Queen[i]] = '.';
}
res.push_back(temp);
return;
}
for (int j = 0; j < n; ++j)
{
Queen[row] = j;
if (check(row,Queen))
{
iQueen(n, (row + 1), Queen, res);
}
}
}
void main()
{
int N = 4;
vector<int> Q(N, 0);
vector<vector<string>> res;
iQueen(N, 0, Q, res);
for (auto a:res)
{
for (auto b : a)
{
cout << b << endl;
}
cout << "------------" << endl;
}
}