leetcode51.N皇后

链接:

https://leetcode-cn.com/problems/n-queens/

描述:

leetcode51.N皇后_第1张图片

示例:

leetcode51.N皇后_第2张图片
leetcode51.N皇后_第3张图片

代码:

class Solution {
public:
	vector<vector<string>> solveNQueens(int n) {
		//按坐标位置存放所有解决方案
		vector<vector<pair<int, int>>> solutions;
		//存放一种解决方案中的所有皇后的位置
		vector<pair<int, int>> solution;
		DFS(solutions, solution, 0, n);
		//把坐标位置转成string
		return transResult(solutions, n);
	}
	void DFS(vector<vector<pair<int, int>>>& solutions, vector<pair<int, int>>& solution, int curRow, int n)
	{
		if (curRow == n) solutions.push_back(solution);
		//尝试当前行的每一个位置是否可以放置一个皇后
		for (int col = 0; col < n; ++col) {
			if (isValid(solution, curRow, col)) {
				//如果可以,在保存当前位置,继续确定下一行皇后的位置
				//直接调用构造函数,内部构造pair, 或者调用make_pair
				solution.emplace_back(curRow, col);
				DFS(solutions, solution, curRow + 1, n);
				//回溯,删除当前位置,尝试当前行的其它位置
				solution.pop_back();
			}
		}
	}
	// solution: 一个解决方案,从第一行开始到当前行的上一行每一行已经放置皇后的点
	bool isValid(vector<pair<int, int>>& solution, int row, int col) {
		// 判断当前行尝试的皇后位置是否和前面几行的皇后位置有冲突
		// i.second == col: 第i个皇后与当前这个点在同一列
		// i.first + i.second == row + col: 第i个皇后与当前点在撇上,横坐标+纵坐标值相同
		// i.first - i.second == row - col:第i个皇后与当前点在捺上, 横坐标-纵坐标值相同
		for (pair<int, int>& i : solution)
			if (i.second == col || i.first + i.second == row + col
				|| i.first - i.second == row - col)
				return false;
		return true;
	}
	vector<vector<string>> transResult(vector<vector<pair<int, int>>>& solutions, int n) {
		vector<string> tmp();
		//把每一种解决方案都转换为string形式,最终结果
		vector<vector<string>> ret;
		for (vector<pair<int, int>>& solution : solutions) {
			//n*n char: 每行有n个元素,把皇后的位置修改为Q
			vector<string> solutionString(n, string(n, '.'));
			for (pair<int, int>& i : solution) {
				solutionString[i.first][i.second] = 'Q';
			}
			ret.push_back(solutionString);
		}
		return ret;
	}
};

你可能感兴趣的:(leetcode,牛客日常,深度优先,leetcode,算法)