回溯法:全排列并进行剪枝
#include <iostream> #include <algorithm> using namespace std; #define N 100000 int C[N]; int tot; int visited[3][N];//列访问,副对角线访问,主对角线访问 //八皇后问题 void search(int n, int cur) { if (cur == n) tot++; else for (int i = 0; i < n; i++) { if (!visited[0][i] && !visited[1][cur + i] && !visited[2][cur - i + n]) { C[cur] = i; visited[0][i] = visited[1][cur + i] = visited[2][cur - i + n] = 1; search(n, cur + 1); visited[0][i] = visited[1][cur + i] = visited[2][cur - i + n] = 0; } } } int main() { int n; cin >> n; search(n, 0); cout << tot << endl; return 0; }