n 皇后问题研究的是如何将 n 个皇后放置在 n×n 的棋盘上,并
且使皇后彼此之间不能相互攻击
上图为 8 皇后问题的一种解法。
给定一个整数 n,返回所有不同的 n 皇后问题的解决方案。
每一种解法包含一个明确的 n 皇后问题的棋子放置方案,该方案中 'Q'
和 '.'
分别代表了皇后和空位。
示例:
输入: 4 输出: [ [".Q..", // 解法 1 "...Q", "Q...", "..Q."], ["..Q.", // 解法 2 "Q...", "...Q", ".Q.."] ] 解释: 4 皇后问题存在两个不同的解法。
思路:
1: 不断递归自己,从第0行第0列开始
2:一个check(int row,int col)函数检查冲突//行,列
3:有找到解,就add进三维数组vector<verctor<string>>中
#include <iostream>
#include <vector>
#include <string>
#include <stdlib.h>
using namespace std;
class Solution {
public:
vector<vector<string>> solveNQueens(int n){
vector<vector<string>>result1;
vector<string>temp(n,string(n,'.'));//初始化为'.'
solve(0, n, temp,result1);//从0行0列开始
return result1;
}
void solve(int row, int n, vector<string>m, vector<vector<string>>&result1){
if (row == n){
result1.push_back(m);
return;
}
for (int i = 0; i < n; i++){
m[row][i] = 'Q';
if (check(row,i,n,m))
solve(row + 1, n, m,result1);
m[row][i] = '.';//回退
}
}
bool check(int row, int col, int n, vector<string>m)
{
if (row == 0) return true;
for (int i = 0; i < row; i++) //列检查
if (m[i][col] == 'Q')return false;
for (int i = 0; i < col; i++)//行检查
if (m[row][i] == 'Q')return false;
for (int i = 1; i <=row&&col+i<=n ; i++)//斜右上方
if (m[row - i][col + i] == 'Q')return false;
for (int i = 1; i <=row&&col-i>=0 ; i++)//斜左上方
if (m[row - i][col - i] == 'Q')return false;
return true;
}
};
void coutm(vector <string>m) {//输出一个阵
int count = m.size();
for (int i = 0; i < count; i++)
if(i==0)
cout << "[\"" << m[i] << "\"," << endl;
else if(i==count-1)
cout << " \"" << m[i] << "\"]," << endl;
else
cout << " \"" << m[i] << "\"," << endl;
}
int main()
{
int n;
cin >> n;
Solution f;
vector<vector<string>> Q = f.solveNQueens(n);
int size = Q.size();
cout << size<<endl;
cout << "[" << endl;
for (int i = 0; i < size; i++) {
coutm(Q[i]);
if(i!=size-1)
cout << endl;
}
cout << "\]";
}
附上c++vector使用方法百度:https://wenku.baidu.com/view/45ac839058fafab068dc02b5.html