目前只能得到一个解,后续会更改
主要是仿造的数独问题的解法
class Solution {
public:
bool isValid(int row, int col, vector<vector<char>> &board) {
for (int i = 0; i < board.size(); i++) {
if (board[row][i] == 'Q' || board[i][col] == 'Q') {
return false;
}
}
int i = row;
int j = col;
int n = board.size();
while (i >= 0 && j >= 0) {
if (board[i][j] == 'Q') {
return false;
} else {
i--;
j--;
}
}
i = row;
j = col;
while (i <= n - 1 && j <= n - 1) {
if (board[i][j] == 'Q') {
return false;
} else {
i++;
j++;
}
}
i = row;
j = col;
while (i >= 0 && j <= n - 1) {
if (board[i][j] == 'Q') {
return false;
} else {
i--;
j++;
}
}
i = row;
j = col;
while (i <= n - 1 && j >= 0) {
if (board[i][j] == 'Q') {
return false;
} else {
i++;
j--;
}
}
return true;
}
vector<string> vectorchar2String(vector<vector<char>> &board) {
int n = board.size();
vector<string> res;
for (int i = 0; i < n; i++) {
string tmp = "";
for (int j = 0; j < n; j++) {
tmp = tmp + board[i][j];
}
res.push_back(tmp);
}
return res;
}
bool backTracking(vector<vector<char>> &board, int remainNum, vector<vector<string>> &res) {
if (remainNum == 0) {
return true;
}
int n = board.size();
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
if(board[i][j] == 'Q') continue;
if (isValid(i, j, board)) {
board[i][j] = 'Q';
if(backTracking(board, remainNum - 1, res)) {
res.push_back(vectorchar2String(board));
} else {
board[i][j] = '.';
}
}
}
}
return false;
}
vector<vector<string>> solveNQueens(int n) {
vector<vector<string>> res;
if (n == 1) {
vector<string> tmp = {"Q"};
res.push_back(tmp);
return res;
}
vector<vector<char>> board(n, vector<char>(n, '.'));
backTracking(board, n, res);
return res;
}
};