中國象棋局面總數粗略計算

2021-07-24 10:42:56 字數 1094 閱讀 2111

將9=c(9,1)

士5=c(5,2)+c(5,1)+1(無士)=16

象7=c(7,2)+c(7,1)+1(無象)=29

兵55=c(50,5)+..+1(無兵)=3478761+341055+26235+1485+55+1=3847592

車90=c(90,2)+c(90,1)+1(無車)=4005+90+1=4096

馬90=c(90,2)+c(90,1)+1(無馬)=4005+90+1=4096

炮90=c(90,2)+c(90,1)+1(無炮)=4005+90+1=4096

3847592*4096*4096*4096*29*16*9=122683692145199546368*9=1104153229306795917312(1gt=1zb=十萬億億)

>> 由於互相佔位, 實際數量要比這個數小得多:

將不在士位: 4 此時士為16種

將在士位: 5 此時士只有c(4,2)+c(4,1)+1=11

那麼將士總數為: 16*4+5*11=119 < 16*9=144

同樣, 佔份額最大的兵也可以大幅度降低, 如兵的可選位置數量為45-1-對方未過河棋子數

還要減去己方已過河棋子數量, 減一是對方將帥必定占去一格, 加上未過河的10個位置

要精確分析會很複雜, 但結果的局面數會更小, 那是才能論證需要多少儲存空間, 多少運算量, 等等

局面的儲存最節省空間的就是求餘, 以上計算就能用70個位元儲存(僅其中一方)

實際上, 當局面數量達到32位(40億時)就可以涵蓋絕大多數情況, 用軟體去對人時基本無敵了

若每個局面使用乙個32位雜湊主鍵, 外加2位元組走法, 那麼占用的空間僅為: 6*4g=24g位元組

可以輕鬆的儲存u盤或者固態硬碟中

將局面140位最多18位元組再加進來, 占用空間僅為: 24*4g=96g, 可以輕鬆存在128g固態硬碟裡

設想走法的橫縱分別不大於9和10, 也就是可以餘9為列, 除9餘10為行, 那麼8100(13位)就能儲存著法

則儲存兩個著法外加6位棋子總數和鍵值, 就能儲存到64位結構體中, 大小為32g

16位,24位的數量分別為64k和16m就更小, 如64k每個6位元組才384k, 連開局庫都算不上

中國象棋軟體 引擎實現(二)棋局表示

對於棋盤的表示當前比較先進的思想是 位棋盤 位棋盤 用於西洋棋非常便捷,因為西洋棋的棋盤正好有64個格仔,可以將乙個棋盤的資訊用乙個64位的變數來表示。其基本思想就是用位上的值是1或0來表示棋子在棋盤相應位置上的存在與否,這樣做的好處是可以通過位操作運算來加快局面評估和著法生成的速度。當用於中國象棋...

中國象棋2

using system using system.collections.generic using system.linq using system.text using system.drawing namespace chinesechess public override bool mov...

中國象棋 題解

中國象棋這道題才看到的時候,畏難情緒很重啊,先介紹題目,大意是在n行 m列的棋盤上,放若干個炮可以是 0個,使得沒有任何乙個炮可以攻擊另乙個炮。請問有多少種放置方法。考試的時候沒有其他的想法,就只想暴力騙分,用乙個一維的標記陣列,再用乙個遞迴,每排最多放兩個。後面想來,完全可以把每排最多放兩個的情況...