leetcode:N-Queens
The n-queens puzzle is the problem of placing n queens on an n×n chessboard such that no two queens attack each other.
Given an integer n, return all distinct solutions to the n-queens puzzle.
Each solution contains a distinct board configuration of the n-queens' placement, where 'Q' and '.' both indicate a queen and an empty space respectively.
For example,
There exist two distinct solutions to the 4-queens puzzle:
[ [".Q..", // Solution 1 "...Q", "Q...", "..Q."], ["..Q.", // Solution 2 "Q...", "...Q", ".Q.."] ]
回溯:
以行为基础,row[ i ] 表示 第 i 行的 queen 所在的列号, cal[ i ] 表示 第 i 列是否有皇后 ,判断 对角线 abs(j-r)==abs(row[j]-row[r]) ?1:0
遍历每一种排列情况就可以得到答案
#include<vector>
#include<iostream>
#include<cstdio>
#include<math.h>
#include<string.h>
#include<algorithm>
using namespace std;
class Solution {
public:
vector<vector<string> >answer;
void solve(int r,int n,int * row,int * cal ){
if(r>n){
vector<string>ans_;
for(int j=1;j<=n;j++){
string ans="";
for(int i=1;i<=n;i++){
if(row[j]==i){
ans+='#';
}
else{
ans+='.';
}
}
ans_.push_back(ans);
}
answer.push_back(ans_);
}
for(int i=1;i<=n;i++){
if(!cal[i]){
cal[i]=1;
row[r]=i;
for(int j=1;j<r;j++){
if(abs(j-r)==abs(row[j]-row[r])){
row[r]=0;
cal[i]=0;
}
}
if(cal[i] && row[r]){
solve(r+1,n,row,cal);
}
row[r]=0;
cal[i]=0;
}
}
}
vector<vector<string> > solveNQueens(int n) {
answer.clear();
int row[n+1];
int cal[n+1];
memset(row,0,sizeof(row));
memset(cal,0,sizeof(cal));
solve(1,n,row,cal);
return answer;
}
};
int main()
{
vector<vector<string> >answer;
Solution A;
answer=A.solveNQueens(8);
for(int i=0;i<answer.size();i++){
cout<<i<<endl;
for(int j=0;j<answer[i].size();j++){
cout<<answer[i][j]<<endl;
}
cout<<endl<<endl;
}
}