N皇后問題

描述

在一個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);
        }
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章