这个问题很经典了,简单解释一下:给你一个 N×N 的棋盘,让你放置 N 个皇后,使得它们不能互相攻击。
PS:皇后可以攻击同一行、同一列、左上左下右上右下四个方向的任意单位。
这个问题本质上跟全排列问题差不多,决策树的每一层表示棋盘上的每一行;每个节点可以做出的选择是,在该行的任意一列放置一个皇后。
作者:labuladong
链接:https://leetcode-cn.com/problems/permutations/solution/hui-su-suan-fa-xiang-jie-by-labuladong-2/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
#include<vector>
#include<stdio.h>
#include<stdlib.h>
#include<iostream>
using namespace std;
vector<vector<string>>res;
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;
}
void backtrace(vector<string>&board,int row){
if(row==board.size()){
res.push_back(board);
return;
}
int n=board[row].size();
for(int col=0;col<n;col++){
if(!isValid(board, row,col)){
continue;
}
board[row][col]='Q';
backtrace(board,row+1);
board[row][col]='.';
}
}
vector<vector<string>>solveNQueens(int n){
// '.' 表示空,'Q' 表示皇后,初始化空棋盘。
vector<string>board(n,string(n,'.'));
backtrace(board,0);
return res;
}
int main(){
int n=2;
vector<vector<string>>res;
res = solveNQueens(n);
for(int i=0;i<n;i++){
for(int j=0;j<n;j++){
cout<<res[i][j]<<' ';
}
cout<<endl;
}
return 0;
}