leetcode51——N皇后问题

皇后问题研究的是如何将 n 个皇后放置在 n×n 的棋盘上,并

且使皇后彼此之间不能相互攻击

leetcode51——N皇后问题_第1张图片

上图为 8 皇后问题的一种解法。

给定一个整数 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>中

#include 
#include 
#include 
#include 
using namespace std;
class Solution {
public:
	vector> solveNQueens(int n){
		vector>result1;
		vectortemp(n,string(n,'.'));//初始化为'.'
		solve(0, n, temp,result1);//从0行0列开始
		return result1;
	}
	void solve(int row, int n, vectorm, vector>&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, vectorm)
	{
		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 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> Q = f.solveNQueens(n);
	int size = Q.size();
	cout << size<

附上c++vector使用方法百度:https://wenku.baidu.com/view/45ac839058fafab068dc02b5.html

你可能感兴趣的:(C++)