题目所给用例输入有误,以输入用例描述为准:每组测试数据占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;
}