Follow up for N-Queens problem.
Now, instead outputting board configurations, return the total number of distinct solutions.

#include <iostream>
#include <string>
#include <vector>
using std::string;
using std::vector;
class Solution
{
private:
void DFS(int n_Index, vector<vector<int>> &State, int &Result)
{
if (n_Index == State.size() - 1)
{
for (int Index = 0; Index < State.size(); ++Index)
{
if (State[n_Index][Index] == 1)
{
Result++;
break;
}
}
return;
}
for (int Index = 0; Index < State.size(); ++Index)
{
if (State[n_Index][Index] == 1)
{
SetStatue(n_Index, Index, 1, State);
DFS(n_Index + 1, State, Result);
SetStatue(n_Index, Index, -1, State);
}
}
}
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:
int totalNQueens(int n)
{
int Result = 0;
vector<int> TmpStatues(n, 1);
vector<vector<int>> State(n, TmpStatues);
if (n == 0)
{
return Result;
}
DFS(0, State, Result);
return Result;
}
};
版权声明:本文为博主原创文章,未经博主允许不得转载。
原文:http://blog.csdn.net/sheng_ai/article/details/49416401