1. 程式人生 > >leetcode51——N皇后問題

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