leetcode51——N-Queens

题目大意:输出N皇后问题(行列对角线不能冲突)的所有解,每个解是一个字符串数组,第i个字符串代表棋盘中的第i行,'Q'代表放置皇后,'.'代表空。

分析:dfs回溯。列出所有解的题目自然想到回溯法求解。用数组记录,i行的皇后放到了cols[i]列,来判断是否可以放置皇后。如何判断对角线是否冲突?想一想是不是:行号之差=列号之差说明在同一对角线上。

代码:转载自https://blog.csdn.net/u010560443/article/details/51079035

class Solution {
public:
	vector<vector<string> > result;
	void create_Matrix(vector<int> cols) {
		string row(cols.size(), '.');  //声明一个全部由'.'组成的字符串
		vector<string> temp;
		for (int i = 0; i < cols.size(); i++) {
			row[cols[i]] = 'Q';  //修改第i行的第cols[i]列
			temp.push_back(row);
			row[cols[i]] = '.';   //将Q改回.以便下个循环添加新的row字符串
		}
		result.push_back(temp);
	}
	bool isOK(vector<int> cols, int pos) {
		for (int i = 0; i < pos; i++) {  //判断pos行的皇后是否和pos之前行的皇后冲突
			if (cols[i] == cols[pos] || abs(cols[i] - cols[pos]) == abs(i - pos))  //列或者对角线冲突返回false
				return false;
		}
		return true;
	}
	void dfs(vector<int> &cols, int pos, int n) {
		if (pos == n) {
			create_Matrix(cols);
			return;
		}
		else {
			for (cols[pos] = 0; cols[pos] < n; cols[pos]++) {  //dfs在第pos行的每列放置皇后
				if (isOK(cols, pos))
					dfs(cols, pos + 1, n);
			}
		}
	}
	vector<vector<string> > solveNQueens(int n) {
		vector<int> cols(n);
		dfs(cols, 0, n);
		return result;
	}
};

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值