八皇后問題

2022-05-25 07:30:12 字數 930 閱讀 6017

問題分析

1、問題解向量(x[1],x[2],x[3],x[4],x[5],x[6],x[7],x[8])

陣列下標i表示皇后所在行號

陣列元素x[i]表示皇后所在列號

2、約束條件

皇后不能同行,這裡設的一維陣列的表示,就顯示約束了每行只能有乙個皇后:x[i]=1,2,…,n

隱約束1:任意兩個皇后不同列:x[i]!=x[j];

隱約束2:任意兩個皇后不處於同一對角線:|i-j|!=|x[i]-x[j]|

3、思路

從棋盤第一行第一列、第二列依次放皇后,放乙個皇后之後到棋盤下一行找符合條件的位置找到之後放皇后(在陣列中記錄皇后位置),然後再跳到下一行找相應的位置,每一次遍歷所在行的所有列,找到符合條件的,最終如果在第8行找到了相應的放皇后的位置,那麼說明找到乙個解向量。

演算法複雜度為o(n^3)。

實現**

#include "stdafx.h"

#include #include /**

*八皇后問題

*陣列下標1-8表示,棋盤的第幾行

*陣列值x[i],表示棋盤的第幾列

*從第一行第一列開始找,設其為皇后所在位,根據邊界條件

*/int x[9];//這裡從下標1開始方便理解

int sum = 0;

void output(int arr);

int main();

bool bound(int k)

} return true;

}void backtrack(int t)

else }

}void output(int arr)

}int main()

八皇后問題

八皇后問題 ackarlix 八皇后問題是乙個古老而著名的問題,是回溯演算法的典型例題。該問題是十九世紀著名的數學家高斯 1850 年提出 在 8x8格的西洋棋上擺放八個皇后,使其不能互相攻擊,即任意兩個皇后都不能處於同一行 同一列或同一斜線上,問有多少種擺法。高斯認為有 76種方案。1854 年在...

八皇后問題

include iostream.h int a 8 8 棋盤 int r 8 結果 int i,j int count 0 void init i j 0 int judge int x,int y for int mi x 1,mj y mi 1 mi for int ri x 1,rj y 1...

八皇后問題

package quess 由於八個皇后的任意兩個不能處在同一行,那麼這肯定是每乙個皇后佔據一行。於是我們可以定義乙個陣列columnindex 8 陣列中第i個數字表示位於第i行的皇后的列號。先把columnindex的八個數字分別用0 7初始化,接下來我們要做的事情就是對陣列columninde...