描述
在一個N*N的棋盤上放置N個皇后,每行一個並使其不能互相攻擊(同一行、同一列、同一斜線上的皇后都會自動攻擊)
分析
遞歸求解。
在k個皇后已經擺好位置的情況下,找出第k+1個皇后可以放的位置。
如果嘗試到的第k+1個皇后的位置與前k個皇后所在的位置不重複,並且第k+1個皇后所在的位置,與之前每一個皇后所在位置的行間距不等於列間距,那麼我們就找到了第k+1個皇后的位置。
代碼
#include <iostream>
#include <cstring>
#include <cmath>
using namespace std;
void queen(int k);
int queenPos[20];
int N;
int main()
{
cin >> N;
queen(0);
return 0;
}
void queen(int k)
{
if(k == N) {
for(int i = 0; i < N; i++) {
cout << queenPos[i] + 1 << " ";
}
cout << endl;
return;
}
for(int i = 0; i < N; i++) {
int j;
for(j = 0; j < k; j++) {
if(queenPos[j] == i || abs(queenPos[j] - i) == abs(k - j))
break;
}
if(j == k) {
queenPos[k] = i;
queen(k + 1);
}
}
}