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