【问题标题】:Simple way to calculate number of chess material combinations计算国际象棋材料组合数量的简单方法
【发布时间】:2014-12-02 03:31:14
【问题描述】:

在国际象棋中,一个棋手可以有不同的材料组合,例如:

“1后,2车,2马,2象,8兵+国王”是一种组合

如果玩家失去一位主教:

“1后,2车,2马,1象,8兵+国王”是另一种组合

..之后,如果一个棋子被提升为一个骑士,那么:

“1后,2车,3马,1象,7兵+国王”是另一种组合

好的,以下组合无效:

“5个皇后,5个车,5个骑士,5个象,2个兵+国王”

因为您缺少要推广的棋子。 (5 个皇后 = 需要 4 个棋子)(5 个车 = 需要 3 个棋子)等等,所以需要 4 + 3 + 3 + 3 = 13 个棋子。由于棋盘上有2个棋子,那么最多可以升级6个棋子。无效。

有多少种有效的材料组合? 我使用以下 C 代码计算了 8694 个组合。问题是:

您是否找到更简单/有效的算法来计算它? (更少的周期、更少的计算、更清晰的代码等)……甚至是数学公式??

total = 0;
for (queens=0;queens<=9;queens++)
for (rooks=0;rooks<=10;rooks++)
for (bishops=0;bishops<=10;bishops++)
for (knights=0;knights<=10;knights++)
for (pawns=0;pawns<=8;pawns++)
{
    pawnsRequested = 0;
    if (queens>1) pawnsRequested += queens - 1;
    if (rooks>2) pawnsRequested += rooks - 2;
    if (bishops>2) pawnsRequested += bishops - 2;
    if (knights>2) pawnsRequested += knights - 2;
    if (8-pawns < pawnsRequested) continue;
    total++;
}
printf("%i\n",total); 

【问题讨论】:

    标签: algorithm chess


    【解决方案1】:

    如果棋子类型是独立的,那么我们可以乘以:10 种可能性的皇后乘以 11 种可能性的车次等等。但是,我们需要跟踪棋子的使用情况。有一个名为generating functions 的数学技巧,我们可以在其中将可能性编码为,例如,rooks as

    3 + x + x^2 + x^3 + x^4 + x^5 + x^6 + x^7 + x^8,
    

    其中x 的幂表示使用的棋子数量,系数表示可能性的数量。在这里,有三种可能性不需要升兵(0、1、2),一种需要升兵(3),一种需要升兵(4),等等。现在我们可以将每个因素相乘(分别为皇后、车、象、骑士、兵)。

      (2 + x + x^2 + x^3 + x^4 + x^5 + x^6 + x^7 + x^8)
    * (3 + x + x^2 + x^3 + x^4 + x^5 + x^6 + x^7 + x^8)
    * (3 + x + x^2 + x^3 + x^4 + x^5 + x^6 + x^7 + x^8)
    * (3 + x + x^2 + x^3 + x^4 + x^5 + x^6 + x^7 + x^8)
    * (1 + x + x^2 + x^3 + x^4 + x^5 + x^6 + x^7 + x^8)
    

    来自Wolfram Alpha

    1x^8 的系数,即 08 所需棋子的可能性数量,分别为 54、135、261、443、693、1024、1450、1986、2648、总和为 8694。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-02-12
      • 2013-05-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-10-19
      相关资源
      最近更新 更多