用集算器寫乙個八皇后

2021-06-22 21:02:22 字數 1058 閱讀 8976

有關西洋棋的問題很多,八皇后問題就是其中相當著名的乙個。在8×8的西洋棋棋盤中,放入8個皇后,使它們不互相攻擊,共有多少種方法呢?

皇后的攻擊範圍是同一行、同一列以及同一斜行,因此,符合條件的8個皇后必須都不在同一行、同一列或者同一斜行上。

由於每一行中只能放入乙個皇后,所以可以使用乙個長度為8的序列,依次設入每行中皇后所在的列數。當某一行還沒有置入皇后時,記為0;每次置入新的皇后時,如果列數不是序列中已有的,就說明沒有皇后在同一列中。

同樣,在置入新的皇后時,還需要保證它與已有的皇后都不在同一斜行上。如果乙個皇后在m行k列,那麼在m+n行,最多只有兩個位置和它在同一斜行上,而且這兩個位置距離它的橫向距離等於縱向距離,也就是說最多只有(m+n,k+n)和(m+n,k-n)這兩個位置與這個皇后在同一斜行上。

這樣,只要把每個皇后在每一行的所有情況都檢查一遍,就可以知道共有多少種情況滿足要求了。

在集算器中,可以通過迴圈計算來完成,如下:

在計算時,用i記錄當前放置皇后的行。第2行**,每迴圈一次,就把當前行的皇后下移1列,用這樣的方法遍歷行中每個位置。第3行**,如果棋子移到了第9列,說明當前行的棋子已經完成了所有位置的迴圈,此時,應該把當前行的記錄復原為0,並將i減1,可以返回去繼續上一行的遍歷;特別的,當第1行也全部迴圈後,說明完成了遍歷,此時i被設為0,停止迴圈。第4行**,在移動第1行皇后時,可以不用判斷,直接開始放置第2個皇后。第6行**,判斷已放好的皇后中,是否存在同一列的;第7行**,判斷已放好的皇后中,是否存在同一斜行的。如果既沒有同一列的,也沒有同一斜行的,就可以繼續放置下一行的皇后了。如果此時8個皇后都放置成功,則在第9行**中記錄下當前每個皇后的位置。

經過計算,a10中結果如下:

可以在c1中檢視具體結果:

寫了乙個八皇后解法

先用最笨的窮舉法求解,有空再研究更好的解法 coding gb2312 size 8 棋盤大小 empty o 空位 queen x 皇后 檢視棋盤的資訊 defshow board cols fori inrange 1,size 1 for j in range 1,size 1 if j co...

寫了乙個八皇后解法

先用最笨的窮舉法求解,有空再研究更好的解法 coding gb2312 size 8 棋盤大小 empty o 空位 queen x 皇后 檢視棋盤的資訊 defshow board cols fori inrange 1,size 1 for j in range 1,size 1 if j co...

用golang寫乙個proxy

我複雜的網路環境中,proxy是個很有用的工具,我們可以通過proxy 幫我們完成網路流量的 這個proxy得先能接收請求,所以這裡先啟動乙個tcp的監聽,獲取請求 func s server start glog.infof proxy listen in s,waiting for connec...