The n-queens puzzle is the problem of placing n queens on an n×n chessboard such that no two queens attack each other.
Given an integer n, return all distinct solutions to the n-queens puzzle.
Each solution contains a distinct board configuration of the n-queens‘ placement, where ‘Q‘
and ‘.‘
both
indicate a queen and an empty space respectively.
For example,
There exist two distinct solutions to the 4-queens puzzle:
[
[".Q..", // Solution 1
"...Q",
"Q...",
"..Q."],
["..Q.", // Solution 2
"Q...",
"...Q",
".Q.."]
]
#include <iostream> #include <string> #include <vector> using std::string; using std::vector; class Solution { private: void DFS(int n_Index, vector<vector<int>> &State, vector<string>&Path, vector<vector<string>> &Result) { if (n_Index == State.size() - 1) { for (int Index = 0; Index < State.size(); ++Index) { if (State[n_Index][Index] == 1) { Path[n_Index][Index] = 'Q'; Result.push_back(Path); Path[n_Index][Index] = '.'; break; } } return; } for (int Index = 0; Index < State.size(); ++Index) { if (State[n_Index][Index] == 1) { Path[n_Index][Index] = 'Q'; SetStatue(n_Index, Index, 1, State); DFS(n_Index + 1, State, Path, Result); SetStatue(n_Index, Index, -1, State); Path[n_Index][Index] = '.'; } } } void SetStatue(int n_Index, int Index, int Value, vector<vector<int>> &State) { // col for (int ColIndex = Index; ColIndex < State.size(); ++ColIndex) { State[n_Index][ColIndex] += Value; } // row for (int RowIndex = n_Index; RowIndex < State.size(); ++RowIndex) { State[RowIndex][Index] += Value; } int RowIndex = n_Index + 1; int ColIndex = Index - 1; while(RowIndex < State.size() && ColIndex >= 0) { State[RowIndex][ColIndex] += Value; RowIndex++; ColIndex--; } RowIndex = n_Index + 1; ColIndex = Index + 1; while (RowIndex < State.size() && ColIndex < State.size()) { State[RowIndex][ColIndex] += Value; RowIndex++; ColIndex++; } } public: vector<vector<string>> solveNQueens(int n) { string TmpString(n, '.'); vector<string> Path(n, TmpString); vector<vector<string>> Result; vector<int> TmpStatues(n, 1); vector<vector<int>> State(n, TmpStatues); if (n == 0) { return Result; } DFS(0, State, Path, Result); return Result; } };
版权声明:本文为博主原创文章,未经博主允许不得转载。
原文:http://blog.csdn.net/sheng_ai/article/details/49416353