题目
N皇后问题
【问题描述】
在N*N的棋盘上放置N个皇后(n<=10)而彼此不受攻击(即在棋盘的任一行,任一列和任一对角线上不能放置2个皇后),编程求解所有的摆放方法。
【输入格式】
输入:n
【输出格式】
每行输出一种方案,每种方案顺序输出皇后所在的列号,各个数之间有空格隔开。若无方案,则输出no solute!
【输入样例】
4
【输出样例】
2 4 1 3
3 1 4 2
用一个数组dp[i]表示第i行皇后所在的位置,然后用0到7初始化数组,求0到7的全排列并过滤掉不满足条件的情况,即dp[i] - dp[j] == i - j 或者dp[j] - dp[i] = i - j。
C++实现
void pailie(vector<int> dp, int index, vector<vector<int>> &out)
{
if (index == dp.size())
{
for (int i = 0; i<dp.size(); i++)
for (int j = i + 1; j<dp.size(); j++)
{
if (dp[j] - dp[i] == j - i || dp[i] - dp[j] == j - i)
{
return;
}
}
out.push_back(dp);
return;
}
for (int j = index; j<dp.size(); j++)
{
swap(dp[index], dp[j]);
pailie(dp, index + 1, out);
swap(dp[index], dp[j]);
}
}
vector<vector<string>> solveNQueens(int n) {
vector<int> dp(n, 0);
for (int i = 0; i < n; i++)
dp[i] = i;
vector<vector<int>> out;
pailie(dp, 0, out);
vector<vector<string>> ret;
for (int i = 0; i < out.size(); i++)
{
vector<string> item;
for (int j = 0; j < n; j++)
{
string tmp = "";
for (int k = 0; k < n;k++)
if (out[i][j] == k)
tmp += "Q";
else
tmp += ".";
item.push_back(tmp);
}
ret.push_back(item);
}
return ret;
}