51. N皇后(Leetcode)

n 皇后问题研究的是如何将 n 个皇后放置在 n×n 的棋盘上,并且使皇后彼此之间不能相互攻击。

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

给定一个整数 n,返回所有不同的 n 皇后问题的解决方案。

每一种解法包含一个明确的 n 皇后问题的棋子放置方案,该方案中 'Q' 和 '.' 分别代表了皇后和空位。

示例:

输入: 4
输出: [
 [".Q..",  // 解法 1
  "...Q",
  "Q...",
  "..Q."],

 ["..Q.",  // 解法 2
  "Q...",
  "...Q",
  ".Q.."]
]
解释: 4 皇后问题存在两个不同的解法。

采用DFS进行搜索,根据规则定义6n-2个标志位,其中n行、n列、45°斜对角2n-1,135°斜对角2n-1

每次放置皇后时判断对应的行列以及斜对角标志位是否为0,以此决定是否放置

注意:规则限制其每行有且必有一个皇后,因此遍历时i = count,表示放入第几个皇后就放入第几行,放置对同一种情况的不同搜索。

class Solution {
public:
	// 0--n-1代表行,n--2n-1代表列
	vector<vector<string>>result;
	vector<string>save;
	void DFS(vector<bool> flag, int count, int n)
	{
		vector<bool> Flag;	//6n - 2
		if (count == n)		//实现一种解法
		{
			result.push_back(save);
			return;
		}
		for (int i = 0; i < 6 * n - 2; ++i)
		{
			Flag.push_back(flag[i]);
		}


		int i = count; 
		if (Flag[i] == 0)
		{
			for (int j = 0; j < n; ++j)
			{
				if (Flag[j + n] == 0 && Flag[2 * n + i + j] == 0 && Flag[5 * n + i - j - 2] == 0)
				{
					save[i][j] = 'Q';
					Flag[i] = 1;
					Flag[j + n] = 1;
					Flag[2 * n + i + j] = 1;
					Flag[5 * n + i - j - 2] = 1;
					DFS(Flag, count + 1, n);
					save[i][j] = '.';
					Flag[i] = 0;
					Flag[j + n] = 0;
					Flag[2 * n + i + j] = 0;
					Flag[5 * n + i - j - 2] = 0;
				}
			}
		}
		
	

	}
	vector<vector<string>> solveNQueens(int n) {
		vector<bool> Flag;
		for (int i = 0; i < 6 * n - 2; ++i)
		{
			Flag.push_back(0);
		}
		string init;
		for (int i = 0; i < n; ++i)
			init.append(".");
		for (int i = 0; i < n; ++i)
			save.push_back(init);

		DFS(Flag, 0, n);
		for (int i = 0; i < result.size(); ++i)
		{
			for(int j = 0;j < result[i].size();++j)
				cout << result[i][j] << endl;
		}
		return result;
	}
};
发布了104 篇原创文章 · 获赞 3 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/Yanpr919/article/details/104333607