1. 程式人生 > >n皇后問題(回溯法-遞迴法和迴圈法)

n皇后問題(回溯法-遞迴法和迴圈法)

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]列。

遞推版本

下課後,我再來補充吧