经典回溯问题:N皇后。把N皇后的代码背下来,修改修改即可。

解法:定义全局变量boardSize,用来控制棋盘大小,此处boardSize=8

另外写了一个init()函数,用来构造8*8的棋盘。

其他思路完全同N皇后,定义string path来存放一次成功的摆放方案,vector<string>res来存放所有的path。

最后只需要sort(res.begin(),res.end(),myCompare); 对res排序完毕后按给出的下标 i 输出相应位置的res[i-1]即可。

#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;


int boardSize;
string path;
vector<string> res;
vector<vector<char>> chessboard;

void init(){
    chessboard=vector<vector<char>>(boardSize,vector<char>(boardSize,'0'));
}

// 判断当前放上皇后的棋盘是否合法
bool islegal(int row, int col) {
    //当前应该在第row行放置皇后,皇后的位置在第col列
    //判断竖排
    for (int i = 0; i < row; i++) {
        if (chessboard[i][col] == 'Q') return false;
    }
    // 左上45°
    for (int i = row - 1, j = col - 1; i >= 0 && j >= 0; i--, j--) {
        if (chessboard[i][j] == 'Q') return false;
    }
    // 右上45°
    for (int i = row - 1, j = col+1 ; i >= 0 && j < chessboard.size(); i--, j++) {
        if (chessboard[i][j] == 'Q') return false;
    }
    return true;
}

//输入包括当前棋盘,以及当前放到第i个位置
void BackTrack(int index) {
    if(index==chessboard.size()){
        res.push_back(path);
        return;
    }
    for(int j=0;j<chessboard.size();j++){
        if(islegal(index,j)){
            path.push_back(j+1+'0');
            chessboard[index][j]='Q';
            BackTrack(index+1);
            chessboard[index][j]='0';
            path.pop_back();
        }
    }
}

bool myCompare(const string &a,const string &b){
    return a<b;
}
int main() {  
    boardSize=8; //修改这里的boardSize即可改变棋盘
    init();
    BackTrack(0);
    sort(res.begin(),res.end(),myCompare);

    int num;
    while(cin>>num){
        cout<<res[num-1]<<endl;
    }

    
}
// 64 位输出请用 printf("%lld")