n皇后
恶心的n皇后,回溯法
没啥好说的
#include <iostream>
#include <vector>
#include <string>
using namespace std;
class Solution {
public:
//放入(x,y)之后标记不能放的位置
void putQueen(int x, int y, vector<vector<int >>& attack){
//8个方向的数组
static const int dx[] = {-1, 1, 0, 0, -1, -1, 1, 1};
static const int dy[] = {0, 0, -1, 1, -1, 1, -1, 1};
attack[x][y] = 1;
//标记皇后会攻击的位置
for(int i=1; i<attack.size(); i++){
for(int j=0; j<8; j++){
int nx = x+i*dx[j];
int ny = y+i*dy[j];
if(nx>=0 && ny>=0 && nx<attack.size() && ny<attack.size()){
attack[nx][ny] = 1;
}
}
}
}
//回溯法解决n皇后
//k当前处理行,n皇后,queue存储皇后位置,attack标记攻击位置,solve全部解法
void backtrack(int k, int n, vector<string> &queue,
vector<vector<int>> &attack,vector<vector<string>> &solve){
if(k == n){
solve.push_back(queue);
return ;
}
for(int i=0; i<n; i++){
if(attack[k][i] == 0){
vector<vector<int> > tmp = attack; //备份attack数组 用于回溯
queue[k][i] = 'Q';
putQueen(k, i, attack);
backtrack(k+1, n, queue, attack, solve);
attack = tmp;
queue[k][i] = '.';
}
}
}
//初始化
vector<vector<string>> solveNQueens(int n) {
vector<vector<string> > solve;
vector<vector<int> > attack;
vector<string> queue;
//初始化attack, queue
for(int i=0; i<n; i++){
attack.push_back(vector<int>());
for(int j=0; j<n; j++){
attack[i].push_back(0);
}
queue.push_back("");
queue[i].append(n, '.');
}
backtrack(0, n, queue, attack, solve);
return solve;
}
};
int main(){
Solution s;
vector<vector<string>> res;
res = s.solveNQueens(8); //8皇后
for(int i=0; i<res.size(); i++){
cout<<"解法"<<i+1<<": \n";
for(int j=0; j<res[i].size(); j++){
cout<<res[i][j]<<endl;
}
cout<<endl;
}
return 0;
}