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记录每一行放皇后的列,col数组记录当前列是否存在函数,使用递归函数,逐行放皇后,不行,再换到下一列。当r == n时,即一种解决办法出来时,保存排列方式。,最后输出
PS:递归程序能看懂,但是对递归理解不是很透彻,希望以后再来研究。
代码:
#include<iostream>
#include<vector>
#include<math.h>
using namespace std;
vector<vector<string> > res;
int row[1000]; //记录每一行的皇后所在列
int col[1000]; //记录该列是否有皇后了
void digui(int r,int n){
int i,j;
if(r == n){ //说明找到了一种排列方式
vector<string> go;
for(i = 0; i < n; i++){
string tmp(n,'.');
tmp[row[i]] = 'Q';
go.push_back(tmp);
}
res.push_back(go);
}
for(i = 0; i < n; i++){
if(col[i] == 0){
for(j = 0; j < r; j++){
if(abs(r-j) == abs(row[j]-i)){ //判断与前面的行对角线上是否冲突
break;
}
}
if(j == r){ //对角线上无冲突
row[r] = i;
col[i] = 1;
digui(r+1,n);
row[r] = 0;
col[i] = 0;
}
}
}
}
int main(){
int i,n,j;
cin>>n;
digui(0,n);
for(i = 0; i < res.size(); i++){
vector<string> a = res.at(i);
for(j = 0; j < a.size(); j++){
cout<<a.at(j)<<endl;
}
cout<<"--------------------------------------------"<<endl;
}
return 0;
}