leetcode51——N皇后問題
阿新 • • 發佈:2018-12-22
n 皇后問題研究的是如何將 n 個皇后放置在 n×n 的棋盤上,並
且使皇后彼此之間不能相互攻擊
上圖為 8 皇后問題的一種解法。
給定一個整數 n,返回所有不同的 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