N-皇后問題

國際象棋中皇后可攻擊其所在行、列以及對角線上的棋子。N-皇后問題是要在N行N列的棋盤上放置N個皇后,使得皇后必吃之間不受攻擊,即任意兩個皇后不在同一行、同一列和系統的對角線。ios

爲解決這個問題,考慮採用回溯法:第i個皇后放在第i行,而後從第一個皇后開始,對每一個皇后,從其對應行(第i個皇后對應第i行)的第一列開始嘗試放置,若能夠放置,則肯定該位置並考慮下一個皇后;若與以前的皇后衝突,則考慮下一列;若超出最後一列,則從新肯定上一個皇后的位置。重複該過程,直到找到全部的放置方案。算法

下面是算法的C++代碼實現。數組

常量和變量說明spa

pos: 一維數組,pos[i]表示第i個皇后放置在第i行的具體位置io

count: 統計放置方案數stream

N: 皇后數變量

C++代碼:統計

#include "stdafx.h"while

#include <iostream>co

 

int isPlace(int pos[], int k);

 

int main() {

const int N = 4;

int i, j, count = 1;

int pos[N + 1];

 

//初始化位置

for (i = 1; i <= N; i++) {

pos[i] = 0;

}

j = 1;

while (j >= 1) {

pos[j] = pos[j] + 1;

//嘗試擺放第i個皇后

while (pos[j] <= N && isPlace(pos, j) == 0) {

pos[j] = pos[j] + 1;

}

//獲得一個擺放方案

if (pos[j] <= N && j == N) {

printf("方案%d:", count++);

for (i = 1; i <= N; i++) {

printf("%d-", pos[i]);

}

printf("\n");

}

//考慮下一個皇后

if (pos[j] <= N && j < N) {

j = j + 1;

}

else {//返回考慮上一個皇后

pos[j] = 0;

j = j - 1;

}

}

system("pause");

return 1;

}

 

int isPlace(int pos[], int k) {

for (int i = 1; i < k; i++) {

if (pos[i] == pos[k] || fabs(i - k) == fabs(pos[i] - pos[k])) {

return 0;

}

}

return 1;

}

相關文章
相關標籤/搜索