leetcode51——N皇后问题

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

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


上图为 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<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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值