题目:51. N皇后
思路
回溯法
代码
cpp
class Solution {
public:
vector<vector<string>> result;
bool right(int row, int col, int n, vector<string>& board)
{
int i, j;
// 不能同行, 这里我又没有写错,为什么结果不对呢?
// `不能同行` 其实可以不需要判断
for(j = 0; j < col; j++)
{
if(board[row][j] == 'Q')
{
return false;
}
}
// 不能同列
for(i = 0; i < row; i++)
{
if(board[i][col] == 'Q')
{
return false;
}
}
// 不能同一斜线
/* (1)
\
\
\
*/
for(i = row-1, j = col-1; i >= 0 && j >= 0;i--, j--)
{
if(board[i][j] == 'Q')
{
return false;
}
}
/* (2)
/
/
/
*/
for(i = row-1, j = col+1; i >= 0 && j < n; i--, j++)
{
if(board[i][j] == 'Q')
{
return false;
}
}
return true;
}
void function(int n, int row, vector<string>& board)
{
if(row == n)
{
result.push_back(board);
return;
}
int i;
// i : 列
for(i = 0; i < n; i++)
{
if(right(row, i, n, board))
{
board[row][i] = 'Q';
function(n, row+1, board);
board[row][i] = '.';
}
}
return;
}
vector<vector<string>> solveNQueens(int n) {
result.clear();
std::vector<std::string> board(n, std::string(n, '.'));
function(n, 0, board);
return result;
}
};
其中判断合法性的时候,"不能同行"其实可以不用写,因为这是在递归过程中,只会选取for
循环里一个元素,接下来就递归到下一层去了(下一行),所以可以不用判断"不能同行";
注意:在通常回溯法写path
的地方改成了board
(就改了个名字),当成二维数组来对待;
同时二位数组大小和棋盘相等,不可以像以往为了图省事故意创建一个大一点的数组(比如一般会凑整数,n=6,直接int path[10];
)