n皇后問題(回溯法-遞迴法和迴圈法)
阿新 • • 發佈:2018-12-17
n皇后問題簡單解釋
對於一個n*n
的棋盤來說,皇后如果是同行同列或者是在同一斜對角上,就是會相互擊殺。
所以,我們需要找到一個安全的(使得所有皇后之間不相互擊殺)安排方式。
遞迴版本
#include <iostream> using namespace std; #include <cmath> int n; bool place(int x[], int k) { for (int i = 1; i < k; ++i) if (x[i] == x[k] || (abs(x[i] - x[k]) == abs(i - k))) return false; return true; } void n_queens(int k, int x[]) { if (k > n) { for (int i = 1; i <= n; ++i) cout << x[i] << " "; cout << endl; } else { for (int i = 1; i <= n; ++i) { x[k] = i; if (place(x, k)) n_queens(k + 1, x); } } } int main() { cin >> n; int *x = new int[n+1]; n_queens(1, x); delete[]x; system("pause"); }
輸入一個n,就可以輸出對應的n皇后的安排方式。
4
2 4 1 3
3 1 4 2
上面的陣列含義,即,在第i行皇后在第x[i]列。
遞推版本
下課後,我再來補充吧