八皇后問題自我總結

2021-07-24 09:10:34 字數 1583 閱讀 4198

no

output

輸出所有八皇后問題的解

註解:在西洋棋中,皇后可以吃掉在同一行、列、斜線的其他的棋子。

八皇后是乙個經典的題目(作為乙個菜鳥這是我碰到的比較難的乙個題,所以自我總結一下,大佬請直接跳過)

在本題中我使用的是c語言(菜鳥只會這個,還在學習中)。

在整個**中我用三個不同的函式(printarray,check,placequeen)來解決問題,printarray用來輸出最後的解,check用來檢查當前放置的棋子是否符合題意,planequeen(dfs)用來不停地放置棋子。

我用乙個一維陣列來表示乙個解,用printarray來翻譯這個一維陣列使其變成最後的答案。

例:04752613:

1 0 0 0 0 0 0 0

0 0 0 0 1 0 0 0

0 0 0 0 0 0 0 1

0 0 0 0 0 1 0 0

0 0 1 0 0 0 0 0

0 0 0 0 0 0 1 0

0 1 0 0 0 0 0 0

0 0 0 1 0 0 0 0

如上圖所示:每一位數字都代表一行中第n+1位有一枚棋子,第一位數字為0,第一行的0+1位就表示有乙個皇后。

其中check函式中來檢查當前放置的棋子是否正確,diff=abs(chess[row]-chess[i]),diff==0時代表有同一列有多個皇后,diff==row-i時代表在同一斜線上有多個皇后(因為在這個一維陣列中每一位數代表一枚棋子的位置,所以不存在同一行有兩個棋子)。

placequeen函式使用了dfs演算法,chess[row]=i代表落入乙個棋子,然後用check函式來檢查對錯,一旦錯誤這一路徑將終結,正確將開始下一次計算,只有當row==n時,當前的一維陣列才是正確的,用printarray函式來輸出答案。

#include#include#define n 8

int chess[n];

int num=1;

int main()

void printarray(int data[8]){

int i,j;

printf("no.%2d:\n",num++);

for(j=1;j<=n;j++){

for(i=0;i

八皇后問題

八皇后問題 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...