1. 程式人生 > >八皇後問題

八皇後問題

pla lac 拓展 res 描述 遞歸解法 cin 兩個 str

問題描述:

八皇後問題是十九世紀著名數學家高斯於1850年提出的。問題是:在8*8的棋盤上擺放8個皇後,使其不能互相攻擊,即任意的兩個皇後不能處在同意行,同一列,或同意斜線上。可以把八皇後問題拓展為n皇後問題,即在n*n的棋盤上擺放n個皇後,使其任意兩個皇後都不能處於同一行、同一列或同一斜線上。

代碼如下:

 1 #include <iostream>
 2 #include <cstdlib>
 3 #include <string>
 4 
 5 using namespace std;
 6 
 7 int queen[1024];
 8 int sum;
9 /** 10 *八皇後問題 經典遞歸解法 11 */ 12 // 打印皇後 13 void printQ(int n) { 14 for (int i = 0; i < n; i++) { 15 for (int j = 0; j < n; j++) { 16 if (queen[i] == j) { 17 cout << "Q "; 18 } 19 else { 20 cout << "* "; 21 }
22 } 23 cout << endl; 24 } 25 26 } 27 // 判斷第i行皇後是否合適 28 bool isValid(int i) { 29 bool res = true; 30 for (int j = 0; j < i; j++) { 31 if (queen[j] == queen[i] || abs(queen[i] - queen[j]) == i - j) { 32 res = false; 33 break; 34 }
35 } 36 return res; 37 } 38 // 放置皇後,表示把第i行的皇後放在第j列 39 void placeQueen(int i,int queenCnt) { 40 if (i == queenCnt) { 41 cout << "" << sum + 1 << " 組的解為:" << endl; 42 sum++; 43 printQ(queenCnt); 44 return; 45 } 46 for (int j = 0; j < queenCnt; j++) { 47 queen[i] = j; 48 // 如果第i行皇後放在第j列合法,則放下一行 49 if (isValid(i)){ 50 placeQueen(i + 1, queenCnt); 51 } 52 } 53 } 54 55 int main() 56 { 57 unsigned int queenCnt; 58 cout << "請輸入皇後的個數:"; 59 cin >> queenCnt; 60 placeQueen(0, queenCnt); 61 cout << "一共 " << sum << " 解!" << endl; 62 system("pause"); 63 return 0; 64 }

八皇後問題