八皇后問題的回溯和遞迴方法

2022-08-14 01:24:13 字數 1030 閱讀 1757

用一維陣列記錄皇后的位置。陣列的下標代表皇后所處的行,下標對應的值代表皇后所處的列。用count記錄皇后的個數,當count小於queen數時,在迴圈體中尋找合適位置的queen。尋找queen:從列1依次尋找,滿足條件則count+1,繼續從列1處尋找下乙個queen。如全部找完沒找到合適的位置,則count-1,從第count個皇后所在列的下一位置開始繼續迴圈。

public

class

queen

}if (count >num )

count--;

queen[ count] ++;}}

private

boolean isvalid(int a , int

count)

public

static

void

main(string ... args)

考慮到我們尋找皇后是按照行的順序依次尋找,因此在程式中,行的資訊可以省略,每次的尋找實際上是為了在列中找到乙個合適的位置。因此我們用乙個int值(當然long也可以),將其第1到列總數的位置為1。這裡我們通過將1左移num位減去1得到。函式test方法的三個引數分別是:皇后占用的位、左對角線皇后占用的位、右對角線皇后占用的位置。每次遞迴中,首先判斷row是否等於upplim,等於則說明所有位被皇后占用,遞迴結束,得到乙個解。若不相等,尋找可用的位(upplim & ~(row | ld | rd)),然後判斷是否為0,為0說明全被占用,遞迴結束,未尋找到可行解。若不為0,則依次把所有可以放置皇后的位放置皇后,然後呼叫遞迴方法。

package

algorithm;

public

class

queen

private

void test(int row, int ld, int

rd)

} else

count--;

}public

static

void

main(string... args)

}

八皇后問題的遞迴和回溯問題

在8 8的西洋棋上擺放八個皇后,使其不能相互攻擊,即任意兩個皇后不得處在同一行 同一列或者同一對角斜線上。下圖中的每個黑色格仔表示乙個皇后,這就是一種符合條件的擺放方法。請求出總共有多少種擺法。此題用到了遞迴和回溯 include int val 10 10 int count 0 方法數 bool...

回溯 八皇后問題(遞迴和非遞迴)

8皇后問題 如何在 8 x 8 的西洋棋棋盤上安排 8個皇后,使得沒有兩個皇后能互相攻擊?如果兩個皇后處在同一行 同一列或同一條對角線上,則她們能互相攻擊。解向量為長度為8 的陣列,記為 solution 因為共有 8個皇后,而棋盤剛好為 8 8,所以每一行肯定會有乙個皇后,那麼我們約定 solut...

八皇后問題(遞迴,回溯)

八皇后問題是乙個以西洋棋為背景的問題 如何能夠在 8 8 的西洋棋棋盤上放置八個皇后,使得任何乙個皇后都無法直接吃掉其他的皇后?為了達到此目的,任兩個皇后都不能處於同一條橫行 縱行或斜線上。八皇后問題可以推廣為更一般的n皇后擺放問題 這時棋盤的大小變為n n,而皇后個數也變成n。當且僅當 n 1 或...