题目所给用例输入有误,以输入用例描述为准:每组测试数据占1行,包括一个正整数b(1 <= b <= 92),改为
1 92
#include <algorithm>
#include <cstdio>
#include <iostream>
#include <vector>
#include <string>
using namespace std;
//输入棋盘边长n,返回所有合法的放置
vector<string> res;
bool isValid(vector<string>& board, int row, int col);
void backtrack(vector<string> &board, int row);
void solveNQueens(int n){
//'.'表示空,'Q'表示皇后,初始化空棋盘
vector<string> board(n, string(n, '.'));
backtrack(board, 0);
}
string ans = "";
//路径:board小于row的那些行都已经成功放置了皇后
//选择列表:第row行的所有列都是放置皇后的选择
//结束条件:row超过board的最后一行
void backtrack(vector<string> &board, int row){
//触发结束条件
if(row == board.size()){
res.push_back(ans);
return;
}
int n = board[row].size();
for(int col = 0; col < n; col++){
//排除不合法选择
if(!isValid(board, row, col))
continue;
//做选择
board[row][col] = 'Q';
ans.push_back(char(col + '1'));
//进入下一行决策
backtrack(board, row + 1);
ans.pop_back();
//撤销选择
board[row][col] = '.';
}
}
//是否可以在board[row][col]放置皇后
bool isValid(vector<string>& board, int row, int col){
int n = board.size();
//检查列是否有皇后互相冲突
for(int i = 0; i < n; i++){
if(board[i][col] == 'Q'){
return false;
}
}
//检查右上方是否有皇后互相冲突
for(int i = row - 1, j = col + 1; i >= 0 && j < n; i--, j++){
if(board[i][j] == 'Q'){
return false;
}
}
//检查左上方是否有皇后互相冲突
for(int i = row - 1, j = col - 1; i >= 0 && j >= 0; i--, j--){
if(board[i][j] == 'Q'){
return false;
}
}
return true;
}
int main(){
solveNQueens(8);
int b;
while(~scanf("%d", &b)){
cout << res[b - 1] << endl;
}
return 0;
}
京公网安备 11010502036488号