用一維陣列記錄皇后的位置。陣列的下標代表皇后所處的行,下標對應的值代表皇后所處的列。用count記錄皇后的個數,當count小於queen數時,在迴圈體中尋找合適位置的queen。尋找queen:從列1依次尋找,滿足條件則count+1,繼續從列1處尋找下乙個queen。如全部找完沒找到合適的位置,則count-1,從第count個皇后所在列的下一位置開始繼續迴圈。
publicclass
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,則依次把所有可以放置皇后的位放置皇后,然後呼叫遞迴方法。
packagealgorithm;
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 或...