编辑代码

#include <iostream>
#include <vector>
#include <list>

using namespace std;

void printQueenResult(int size, vector<int> result) {
    for (size_t row = 0; row < size; ++row)
    {
        for (size_t column = 0; column < size; ++column)
        {
           if (result[row] == column)
           {
               cout << "X";
           }
           else {
               cout << "O";
           }
           
        }
        cout << endl;
    }
    cout << endl;
    
}
bool isValid(int size, vector<int> &result, int row, int column) {
    int leftUp = column - 1;
    int rightUp = column + 1;

    // 遍历当前行之上所有放置了皇后的行,看在当前列放置皇后是否合适
    for (int r = row - 1; r >= 0; --r)
    {
        // 上面的行对应的列放有棋子
        if(result[r] == column)
        {
            return false;
        }

        // 上面的行对应的左斜线上的列放有棋子
        if (leftUp >= 0 && result[r] == leftUp)
        {
            return false;
        }

        // 上面的行对应的右斜线上的列放有棋子
        if (rightUp < size && result[r] == rightUp )
        {
            return false;
        }

        
        --leftUp;
        ++rightUp;
    }

    return true;
    
}
void queen(int size, int row, int &count, vector<int> &result, list<vector<int> > &results) {
    // 棋盘大小和准备放皇后的行编号相等,说明皇后都放到棋盘上了
    if (size == row) {
        // 统计可以成功在棋盘上放置皇后的方法的次数
        ++count;
        // 记录成功摆放皇后的方法
        results.push_back(vector<int>(result));
        return;
    }
    // 遍历当前行对应的所有列
    for (size_t column = 0; column < size; ++column)
    {
        // 判断皇后是否能放到当前行对应的列上
        if (isValid(size, result, row, column))
        {
            // 能放置,记录下列编号
            result[row] = column;
            // 放置下一行的皇后
            queen(size, row + 1, count, result, results);
        }
    }

}

int main() {
    int size = 0;
    

    while (true)
    {
        cout << "Please enter the size of queen problem:" << endl;
        cin >> size;
        if (size <= 0)
        {
            cout << "Exit" << endl;
            break;
        }

        vector<int> result(size, 0);//记录一个放置的方法
        list<vector<int> > results;// 记录所有能够成功放置的方法
        int count = 0;// 统计有多少中放法

        queen(size, 0, count, result, results); 

        cout << "We have " << count << " methods." << endl;
        
        for (list<vector<int> >::iterator i = results.begin();
        i != results.end(); ++i)
        {
            printQueenResult(size, *i);
        }
         

        
    }
    
    
}