它在傳統中的位置

象棋排局是更古老的傳統。已知最早的排局「二龍出海」,見於南宋類書《事林廣記》,年代定為1266年。古典棋譜隨後出現:1570年收局550則的《適情雅趣》,1632年的《橘中秘》,再到清代各譜,其中1801年的《竹香齋象戲譜》收有「七星聚會」等著名江湖排局(棋譜簡史)。

貫穿其中的是固定的目標。每道題都標明結果,勝或和,解題者替敗方走出最頑強的應著。明代的題幾乎都是勝局,清代的多為和局。這個傳統靠一代代變換局面發展,而不是變換對解題者的要求。

西方排局走了另一條路:保留棋盤,改變目標。馬克斯·朗格於1854年發表了第一道合作殺,白方先走,且不止一解;薩姆·勞埃德1860年的題首次讓黑方先走,A. 巴爾貝1861年的題首次只有唯一解(該體裁的歷史)。自殺題、連續著法題等也都是這樣來的。如今合作殺是國際棋聯排局年鑑(FIDE Album,官方的優秀排局選集)中最大的單一類別:2010至2012年卷9,218則中占2,539則(FIDE)。

亨利·福斯伯格,1935年。解法是 1. Qf6 Nc5 2. Qb2 Ra4 將殺(Q為皇后,N為騎士,R為城堡):黑皇后走到b2,堵住自己國王的最後一格,白城堡成殺。這道題以「孿生題」聞名:把a6的皇后換成城堡、主教、騎士或兵,每一種都有各自的唯一解,一張圖五種殺法。

將棋也從西洋棋那裡借來了這個想法。將棋排局家稱之為ばか詰(bakazume),即合作詰將:雙方合作,用最少的步數將死守方的王;與將棋的普通詰將棋一樣,攻方先走(西洋棋裡通常是被殺的一方先走),盤上一般沒有攻方的王,守方持有所有不在盤上的棋子。以此為目標的變體詰將棋到1960年代已有發表;1970年Kato Tetsu發表了一道長達163手的作品,1971年《詰将棋パラダイス》雜誌開始定期刊登這類題(日文維基百科)。

9a8b7c6d5e4f3g2h1i玉龍香守方持有其餘所有棋子攻方手中無子
三步合作詰,攻方先走。攻方向上進攻,在3d有一枚龍王,即紅色的棋子:升變後的飛車,可以像飛車一樣走,也可以斜走一格。守方的棋子朝下,王在2b,香車在2e,香車可以向正前方走任意格。
9a8b7c6d5e4f3g2h1i龍玉香守方持有其餘所有棋子攻方手中無子
龍王吃掉2e的香車並將軍,王走到1c,攻方把吃來的香車打在1d。龍王控制1d和整條2路,香車的攻擊線穿過王直達1b。

日文維基百科這一頁的例子說明了合作目標帶來的變化。把香車打在1路上離王更遠的地方,看起來同樣可行,但這樣一來,持有所有餘子的守方就能在中間打入一子。普通詰將棋不計較一個只會被直接吃掉的墊子;合作詰則要計算它,所以只有打在1d才能三步成殺。我們對這個局面的搜尋結果一致:它是唯一的三步合作殺,且不存在一步殺。

我們還沒有找到比我們更早的象棋合作殺。用西洋棋排局家對合作殺的各種叫法做中文網路搜尋,找到的是西洋棋題和普通的象棋殺法,從來沒有合作的象棋題;古典棋譜要求的也都是勝或和。如果你知道更早的一道,請告訴我們。

如何編題

生成器是這項工作中天真的一半,這一點值得直說。局面生成器盲目地擺出圖形:要麼枚舉少數幾子的所有擺法,要麼按設定雙方子力的配置隨機擺出陣容。求解器遍歷雙方各兩步的所有合作走法,黑方先走,只保留恰好一路成殺的圖形。生成器本身完全不知道什麼是好題:它不瞄準任何主題,不偏好靜著勝過吃子,也沒有經濟性的概念。給黑方整支軍隊、紅方一兩個子的配置,產出了大部分值得一看的題。

for each diagram the position maker deals:
    # every placement, or random armies from a profile
    if the diagram is illegal: discard
    lines = every Black, Red, Black, Red line that mates
    if len(lines) != 1: discard   # sound: exactly one
    keep (diagram, lines[0])      # 1,470 kept

# final picture: the mater and its square, the
# general's square, what covers each escape
group the kept problems by their final picture
keep one per group                # 186

re-prove each one, counting a general with no legal
move as mated, and requiring no mate in one
                                  # 164 stand
流程概覽。

這只是起點,上面還有很大的空間。排局家從一個構思出發,圍繞它搭建局面,搜尋也可以這樣做。它可以從想要的殺形出發,比如炮隔著黑方的炮架將殺,再倒推出兩步之前的局面,而不是一直擺到碰上一道為止。它可以拿一道好題,一次改動一個子,保留那些讓正確的第一步更難看出、或讓紅方閒置子力更少的改動。它可以給解題者的感受打分:黑方有多少個第一步看起來和正解一樣自然,關鍵著是不是一步靜著。或者它可以完全不靠隨機擺局。西洋棋排局家現在有了窮舉的合作殺表,五子以內已經完整,列出給定子力下所有無誤的合作殺,搜尋只剩挑選;我們沒有為象棋做這樣的表。這些方法每一種都能找到我們的方法找不到的題。

結果

搜尋找到1,470道無誤的合作殺。大多數是同一個殺形從不同的布局得到,往往只是一個旁觀的子挪了一格,所以我們按最終殺形分組。剩下186種不同的殺法。複核又去掉了22道,原因見下文,留下164道。

164道中,39道是純殺,即被殺一方將周圍沒有一格被重複控制;19道是純正殺:既是純殺,盤上每個紅子又都在發揮作用。

成殺的子題數
卒58
車50
馬28
砲28
留下的164道題,按最後一步將軍的紅子分類。

最好的十道

十道題,各有一個主題。全部164道都在這個研習裡,這十道在前,其餘按排名排列。每一道都屬於我們搜尋的那一塊:黑、紅、黑、紅,紅方第二步成殺。

紅方只有帥和一兵,對黑方七子,其中有一車和雙士。先找出孤兵能在哪一格成殺,再想想哪個黑子得去堵住自己的將。

紅方有帥和一匹已在黑方陣中的馬;黑方有十二子。黑方有45種合法的第一步,只有一種能導向殺局。

一門紅炮對黑方十五子。炮沒有炮架就不能將軍,所以要看哪個黑子能當炮架。

一輛紅車對十二子,黑方底線已經空了一些。問題是黑將旁邊哪些格子需要填上,用什麼子填。

又是帥和一馬對十二子,這次馬在h8,靠近角上的一輛黑車。這匹馬要用掉紅方的兩步。

十道中子力最多的一局:三個紅兵深入黑方半邊,對黑方十四子。

六個子:紅方帥、炮、兵,黑方將、炮、馬。看看e5的紅炮在將軍之前需要什麼。

黑將已經離開底線,紅兵和紅炮疊在g路上。紅方這裡的最後一步一著兩用。

開闊的棋盤上黑方有雙車、一馬、一炮,第一步有55種合法走法。紅方只有一馬。

帥和一兵對十二子,兵已在黑方九宮旁的f8。黑方得用自己的子把籠子合上。

我們學到了什麼

象棋決定什麼才算無誤。將帥無子可走即判負,所以合作殺也可以在被殺一方沒有被將軍、只是無棋可走時結束。我們的編題程式只檢測了將死。按真正的規則複核後,186道中有22道另有程式沒看到的路線,從3路到64路不等,其中兩道一步就能殺。從西洋棋移植來的無誤檢驗,也把西洋棋對「終局」的理解一併帶了過來。

九宮讓這些懸殊的題成為可能。象棋的將帥從不離開九個點的九宮,最多只有四個點可走,所以黑方走幾步就能把它圍死。這與搜尋的結果相符:黑方整支軍隊對紅方一兩個子的配置產出了大部分好題,因為幾乎所有的搭建都由黑方完成,紅方只需趕到。西洋棋的王擁有整個棋盤和最多八個格子,那裡的合作殺要花多得多的步數把這些格子一一封掉。

炮是西洋棋不可能有的主題。炮隔一子將軍,而在合作殺裡被殺一方是合作的,所以黑方可以送上炮架。164道中有19道借黑方的炮架成殺。將帥不能對面的規則又添了一種:紅帥可以從自己的九宮控制格子,比如第七道題。

找到無誤的題是容易的部分。搜尋找到1,470道無誤的合作殺,大多數是同一個殺形從不同的佈局得到:按最終殺形分組後只有186種。是否無誤是一個求解器能檢驗的是非題。一道題值不值得擺給朋友看則不是,而這個流程裡沒有任何東西能衡量它。這正是下一個生成器要填補的空白。

還有什麼可找

我們只搜尋了這個體裁的一角,其餘都還空著。首先是更長的合作殺。我們的搜尋幾乎沒找到無誤的三步合作殺:多一步,雙方就有多得多的方法走到同一個殺形,所以生成器得直接瞄準唯一路線,而不是先擺後篩。無誤的象棋合作殺最長能有多長:十步,二十步,一百步?搜尋能否證明一道長題是同類中最短的,或者它的路線是唯一的?

更多看似不可能的題:最弱的紅方子力對最多的黑子,一個孤兵將死整支軍隊。還有這個體裁的其他形式:紅方先走,以及紅方作為被殺的一方。這兩種我們都還沒有搜尋。如果你找到一道,或者比我們的更長、更奇的,我們很想看看:發到論壇,或者寫在你自己的部落格上並告訴我們在哪裡。

這一小塊已經表明,象棋容得下合作殺,而且它們不是換了張棋盤的西洋棋題。讓象棋成為象棋的那些規則,困斃判負、炮架、將帥對面,決定了哪些題無誤,也決定了最好的題如何成殺。好題看起來不可能,因為紅方幾乎什麼都沒有。它之所以成立,是因為黑方的大軍正是構成殺局的材料:牆、炮架、自己將周圍被填滿的格子。這就是這項工作背後的希望:把西方排局家發明的體裁搬到象棋棋盤上,找出它們在這裡的美,並且終有一天找到一道好到讓象棋棋手停下來、擺給朋友看的合作殺。

解全部164道最長的連將殺