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