/**
* @file solveNQueens.cpp
* @author your name (you@domain.com)
* @brief
* @version 0.1
* @date 2022-06-27
*
* @copyright Copyright (c) 2022
* 给你一个 N×N 的棋盘,让你放置 N 个皇后,使得它们不能互相攻击 皇后可以攻击同一行、同一列、对角线的单位
*/
#include <vector>
#include <iostream>
#include <string>
using namespace std;
vector<vector<string>> res;
//判断是否合法
bool isValid(vector<string>& track, int row, int col)
{
int n = track.size();
//当前列是否有冲突
for(int i = 0; i < n; i++)
{
if(track[i][col]=='Q') return false;
}
//判断右上对角线
for(int i = row - 1,j = col + 1;i >= 0 && j < n;i--,j++)
{
if(track[i][j]=='Q') return false;
}
//判断左上对角线
for(int i = row - 1,j = col - 1;i >= 0 && j >= 0;i--,j--)
{
if(track[i][j]=='Q') return false;
}
return true;
}
void solveNQueens(vector<string>& track,int row)
{
//终止条件
if(track.size() == row)
{
res.push_back(track);
return ;
}
//循环当前行的每一列
for(int col = 0; col < track[row].size();col++)
{
//决策判断
if(!isValid(track,row,col)) continue;
//符合条件放置皇后
track[row][col] = 'Q';
//下一层遍历
solveNQueens(track,row+1);
//撤销选择
track[row][col] = '.';
}
}
vector<vector<string>> compute(int n)
{
//初始化
// '.' 表示空,'Q' 表示皇后,初始化空棋盘。
vector<string> track(n,string(n,'.'));
solveNQueens(track,0);
return res;
}
int main()
{
vector<vector<string>> results = compute(8);
for(auto res : results)
{
for(auto re : res)
{
cout << re << endl;
}
cout << endl;
}
}
12-28
1321
06-27
07-19
269