八皇后問題

2021-07-03 23:49:50 字數 1437 閱讀 1433

皇后問題,是乙個古老而著名的問題,是

回溯演算法

的典型案例。該問題是國際西洋棋棋手馬克斯·貝瑟爾於2023年提出:在8x8格的

西洋棋

一般看到這種圖,大家第一感覺肯定是用乙個二維陣列來表示出座標資訊,但此處,感覺題目進行分析,8x8的棋盤上擺放8個皇后,且不能同行、同列和同一斜線上,那麼也就是說每行最多乙個皇后。因此我們僅用乙個長度為8的陣列就可以表示出皇后的位置資訊,該陣列的索引n即為第n行,索引對應的值即為第n行皇后所處的列數。

另外,對於該問題,也不能簡單的進行遍歷,因為時間複雜度為8*8*8*8*8*8*8*8*8,8的8次方。換個角度:

1,在第n行放置皇后,只需要判斷前n-1行皇后的位置與第n行皇后的關係,那麼剩下的8-n行在這個迴圈中是不需要判斷的(因為此時剩下的行還沒有皇后啊

2,如果第n行放置失敗,則要回溯到第n-1行,重新選擇第n-1行皇后所處的列數。如果第n-1行依然放置失敗,則再回溯到第n-2行,以此類推;

3,如果第n行為最後一行了,則說明完全成功,列印整個棋盤。

#include #include #include #include #include #include // 列印整個陣列

void printpos(const int *pos, const int cnt)

else

} printf("\n");

} printf("\n");

}// 嘗試在第row行插入的第col列插入值

int tryinsertpos(int* pos, const int cnt, int row, int col)

// 不能在對角線上。

if(abs(col - othercol) == abs(row - otherrow)) }

pos[row] = col;

// 最後一行,已經滿足條件了。

if(cnt == row + 1)else

} return ret; }}

int main(int argc, char** argv)

// 陣列的索引為皇后所在的行數,索引對應的值表示該皇后對應的列數。

// 如pos[1] = 2,則表示在第二行第三列存在皇后。

int *pos = (int*)malloc(sizeof(int) * cnt);

if(null == pos)

memset(pos, 0, sizeof(int) * cnt);

//tryinsertpos(pos, cnt, 0, 0);

for(int i = 0; i < cnt; ++i)

free(pos);

return 0;

}

八皇后問題

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