八皇后問題

2021-04-13 08:25:41 字數 2977 閱讀 9216

八皇后問題

ackarlix

八皇后問題是乙個古老而著名的問題,是回溯演算法的典型例題。該問題是十九世紀著名的數學家高斯

1850

年提出:在

8x8格的西洋棋上擺放八個皇后,使其不能互相攻擊,即任意兩個皇后都不能處於同一行、同一列或同一斜線上,問有多少種擺法。

高斯認為有

76種方案。

1854

年在柏林的象棋雜誌上不同的作者發表了

40種不同的解,後來有人用圖論的方法解出

92種結果。

演算法一:遞迴實現

n皇后問題

演算法分析:陣列a

、b、c

分別用來標記衝突,

a陣列代表列衝突,從

a[0]~a[7]

代表第0

列到第7

列,如果某列上已經有皇后,則為

1,否則為0;

陣列b代表主對角線衝突,為

b[i-j+7]

,即從b[0]~b[14]

,如果某條主對角線上已經有皇后,則為

1,否則為0;

陣列c代表從對角線衝突,為

c[i+j]

,即從c[0]~c[14]

,如果某條從對角線上已經有皇后,則為

1,否則為0。

程式如下: #

i nclude 

static char queen[8][8];

static int a[8];

static int b[15];

static int c[15];

static int iqueennum=0; //

記錄總的棋盤狀態數

void qu(int i); //引數i

代表行

int main() //

主、從對角線標記初始化,表示沒有衝突

for(iline=0;iline<15;iline++)

b[iline]=c[iline]=0;

qu(0);

return 0;}

void qu(int i)

printf("/n/n");}//

如果前次的皇后放置導致後面的放置無論如何都不能滿足要求,則回溯,重置

queen[i][icolumn]='*';

a[icolumn]=0;

b[i-icolumn+7]=0;

c[i+icolumn]=0;}}

} 演算法二:用棧實現的

n皇后問題 #

i nclude

#i nclude

/*===

定義棧與操作

==------------------*/

struct stack *top;

void push(int row,int col);

void pop();

/******

棧的定義完畢

==---------------*/

#define maxqueen 8

/******==

三個衝突陣列確定是否能放置皇后

**///0

表示無衝突,

1表示有衝突

static int a[maxqueen];//

列衝突static int b[maxqueen*2-1];//

主對角線衝突

static int c[maxqueen*2-1];//

副對角線衝突

static int d[maxqueen];

/******=**/

void setqueen(int row,int col);//

放置皇后後在該處設定衝突

void desetqueen(int row,int col);

bool noconflict(int row,int col);//

判斷該位置放置皇后

//是否與其他皇后衝突

//char arrayqueen[maxqueen][maxqueen];

ofstream outqueen;//

定義乙個輸出檔案流

void displayandset();

//bool queen();

//void main()

;//記錄每一列上次的行數,全部初始化為

0while( col

從該列上一次記錄的行數開始迴圈

while(row

判斷該位置是否發生衝突

precolrow[col]=row;//

記錄該列的行

break;//

跳出,進行下一次列迴圈

}row++;//

如果發生衝突,繼續行迴圈

}if(row繼續下一列迴圈

col++; //

如果row

等於了maxqueen,

也就是說,該列無法放置皇后

,else //

需彈出前一列的皇后,

//而且從前一列再開始迴圈,並從被彈出的皇后那一行的下一行開始行迴圈

if(precolrow[0]==maxqueen&&count>0)//

控制結束

return true;

if(precolrow[0]==maxqueen)

return false;

}return true;}

void setqueen(int row,int col)

void desetqueen(int row,int col)

bool noconflict(int row,int col)

void displayandset()

void push(int row,int col)

void pop()}

輸出結果有

92種狀態

八皇后問題

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...

八皇后問題

1.問題描述 在n n的棋盤上放置n個不能互相捕捉的西洋棋 皇后 的所有布局。這是 於西洋棋中的乙個問題。皇后是棋盤上最具殺傷力的乙個棋子,她可以捕捉與她在同一行,或同一列,或同一斜線 有兩條 上的所有棋子。如下圖所示,紅線經過的格仔都會被皇后捕捉。問題分析 1 皇后的殺傷力在她所對應的行,列,和兩...