【发布时间】: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);
【问题讨论】: