蓝桥-BASIC-27-2n皇后问题
2017-05-31 00:58
316 查看
ACM模版
依然是逐行判断,不过需要同时放两个皇后才能继续深入搜索……
描述
题解
一道水题,本来不打算写,但是发现是经典的8皇后问题的延伸,感觉挺不错的,所以写写玩……想当初最开始学习 dfs 就是通过八皇后问题来学习的。依然是逐行判断,不过需要同时放两个皇后才能继续深入搜索……
代码
#include <iostream> #include <queue> #include <cstring> #include <cstdio> using namespace std; const int MAXN = 10; int map[MAXN][MAXN]; int visB[MAXN]; int visW[MAXN]; int n; int cnt = 0; bool charge(int row, int col, int tag) { if (map[row][col] != 1) { return false; } if (tag == 2 && visB[col]) { return false; } if (tag == 3 && visW[col]) { return false; } for (int i = 0; i < n; i++) { if (row - i > 0 && row - i <= n && col + i > 0 && col + i <= n) { if (tag == map[row - i][col + i]) { return false; } } } for (int i = -n + 1; i < 0; i++) { if (row + i > 0 && row + i <= n && col + i > 0 && col + i <= n) { if (tag == map[row + i][col + i]) { return false; } } } return true; } void dfs(int row) { if (row > n) { cnt++; // cout << cnt << '\n'; // for (int i = 1; i <= n; i++) // { // for (int j = 1; j <= n; j++) // { // cout << map[i][j] << ' '; // } // cout << '\n'; // } return ; } for (int i = 1; i <= n; i++) { if (charge(row, i, 2)) { map[row][i] = 2; visB[i] = 1; for (int j = 1; j <= n; j++) { if (charge(row, j, 3)) { map[row][j] = 3; visW[j] = 1; dfs(row + 1); map[row][j] = 1; visW[j] = 0; } } map[row][i] = 1; visB[i] = 0; } } } int main() { cin >> n; for (int i = 1; i <= n; i++) { for (int j = 1; j <= n; j++) { scanf("%d", map[i] + j); } } dfs(1); cout << cnt << '\n'; return 0; }