八皇后問題的深入剖析

2021-10-05 09:03:46 字數 1299 閱讀 1152

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

解決該問題的關鍵在於當我們放置乙個皇后後,如何表示占領了當前行,當前列,當前斜線(正斜線,反斜線)。對於行,我們可以從第一行開始依次向後放置皇后,形成乙個"天然"不會發生衝突的過程。對於列,我們可以設定乙個狀態陣列statecol[8]表示當前列是否被占領(0表示未佔領,1表示占領)。對於斜線的占領就相對顯得比較複雜了。首先我們看正斜線,對於每一正斜線,其行號減去列號的值相等(row - col),範圍是 -7到7,一共用15中情況,我們可以設定乙個狀態陣列statezx[15]來表示當前正斜線是否被占領,需要注意的值,由於陣列的下標沒有負數,所以在占領某一正斜線是我們需要將其整體的值加7,即row-col+7.同理,對於反斜線,我們觀察可得,每一反斜線的row+col的值相等,範圍是0到17,一共15種狀態,我們可以設定乙個狀態陣列statefx[15]來表示當前反斜線是否被占領。結合一下圖示,對於以上分析的理解可能會相對更加容易。

//八皇后求解函式

public

static

void

eightqueens

(int row)

else

//回溯

statecol[col]=0

; statezx[row-col+7]

=0; statefx[row+col]=0

;}}}

}如果要求出問題的所有解,就必須對棋盤的所有位置進行試探,其時間複雜度為o(8^8),當我們放置皇后時,實際上每次放置的操作都一樣,故我們可以進行遞迴呼叫,遞迴的出口為 row> 7。由於要求出所有解,當找到乙個解後,就必須回溯,取消占領狀態,而後在for迴圈的引導下對下一列位置進行判斷,對行row是否大於7進行判斷,當for迴圈結束後,函式返回,又再次重複上述的過程。最後函式結束時必定是最先開始的for迴圈結束,即eightqueens(0)的col=8.結合以下圖示將會對這個過程有更加清晰的認識。

以上即是對八皇后問題的簡單分析。

八皇后的問題

八皇后的問題和馬踏棋盤的思路是一樣,都用到了回溯的思想。也都差不多。這個裡面最精彩的地方用4個一位陣列表示了這個棋盤。這個裡面總共有92組解 展示 include includeint col 8 int right 15 int left 15 int queen 8 int cnt 全域性變數 ...

八皇后的問題

首先介紹一下八皇后的問題。這是乙個古老而著名的問題,指的是在乙個8x8的西洋棋棋盤上,有八個皇后,每個皇后佔乙個 要求皇后之間不會出現相互攻擊的現象,即不能有兩個皇后處在同一行 同一列或同一對角線上。問乙個有多少種不同的排列方法?下面是 includeusing namespace std stat...

八皇后問題

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