它在传统中的位置

象棋排局是更古老的传统。已知最早的排局“二龙出海”,见于南宋类书《事林广记》,年代定为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道最长的连将杀