思路:
题目给出的测试数据范围比较小, 使用回溯就可以AC, 搞的我也没有兴趣去研究高效解法了
总结:
刚开始, 本以为用棋盘问题的状态压缩 DP 就可以解决, 但做完 N-queen 才发现多个皇后并不能在同一条斜线上, 状态压缩的解法似乎就不好用了
代码:
#include <iostream> #include <vector> #include <string> using namespace std; class Solution { public: int N; vector<int> pos; int result; bool visited[10]; bool attack(const int &row, const int &col) { for(int i = 0; i < pos.size(); i ++) { if(abs(pos[i]-col) == abs(i-row)) return true; } return false; } void dfs(const int &depth) { if( depth == N) { result += 1; } for(int i = 0; i < N; i ++) { if(visited[i] == 0 ) { if( pos.size() > 0 && attack(depth, i)) continue; visited[i] = 1; pos.push_back(i); dfs(depth+1); pos.pop_back(); visited[i] = 0; } } } int totalNQueens(int n) { pos.clear(); result=0; memset(visited, 0, sizeof(visited)); N = n; dfs(0); return result; } }; int main() { Solution solution; int res = solution.totalNQueens(9); cout << res << endl; return 0; }
#include <iostream> #include <vector> #include <string> using namespace std; class Solution { public: int N; vector<int> pos; vector<vector<string> > result; bool visited[10]; bool attack(const int &row, const int &col) { for(int i = 0; i < pos.size(); i ++) { if(abs(pos[i]-col) == abs(i-row)) return true; } return false; } void dfs(const int &depth) { if( depth == N) { vector<string> temp; string str; for(int i = 0; i < N; i ++) { str.clear(); for(int j = 0; j < N; j ++) { if(pos[i] == j) str.push_back('Q'); else str.push_back('.'); } temp.push_back(str); } result.push_back(temp); } for(int i = 0; i < N; i ++) { if(visited[i] == 0 ) { if( pos.size() > 0 && attack(depth, i)) continue; visited[i] = 1; pos.push_back(i); dfs(depth+1); pos.pop_back(); visited[i] = 0; } } } vector<vector<string> > solveNQueens(int n) { pos.clear(); result.clear(); memset(visited, 0, sizeof(visited)); N = n; dfs(0); return result; } };