当前位置: 首页 > 知识库问答 >
问题:

象棋材料组合个数的一种简便计算方法

文华美
2023-03-14

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

“1个王后、2个公鸡、2个骑士、2个主教、8个爪牙+国王”是一个组合

如果玩家失去一个主教:

“1个王后2个公鸡2个骑士1个主教8个爪牙+国王”是另一种组合

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

“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); 

共有1个答案

史高阳
2023-03-14

如果棋子的类型是独立的,那么我们可以乘以:10种可能的皇后乘以11种可能的雄鸡乘以等,我们需要跟踪典当的使用,然而。有一种叫做生成函数的数学技巧,我们可以把它的可能性编码为

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。

 类似资料:
  • 简单地说,我不想使用第三方库,我只想知道是否可以使用android支持库以及如何做到这一点。

  • 问题内容: 有什么方便的方法可以替换数组的内容并对其进行引用?我不想这样替换数组: 这种方法具有的内容,但是我松了其中的引用,因为它仍然指向 原始内容 。 这样,我就不会失去参考: 这里的缺点是,我必须清空,迭代其中的每个元素并用手将其推入。 我的问题是: 当然,我可以为此写一个助手,但是最有效的方法是什么? 有没有一种简短的,通用的javascript方法可以做到这一点(也许只有一个内衬吗?)

  • 给定一组数,找出任意数适合的最小倍数和 < li >集合中的数字可以多次使用(或根本不使用)以获得“总和” < li >这组数字可以是任何正十进制数(即< code>1,4,4.5 ) < li >给定/任意数阈值可以是任意小数(即< code>5 ) > < li> 找出给定数字能与最小余数相适应的倍数组合 找到一个数字可以四舍五入到的最小“总和” 每个组合中使用的实际数字本身对于这个特定的挑战

  • 本文向大家介绍计算一个Java对象占用字节数的方法,包括了计算一个Java对象占用字节数的方法的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了如何计算(或者说,估算)一个Java对象占用的内存数量的方法。分享给大家供大家参考。具体分析如下: 通常,我们谈论的堆内存使用的前提是以“一般情况”为背景的。不包括下面两种情形:   某些情况下,JVM根本就没有把Object放入堆中。例如:原则上讲

  • 北卡罗来纳州彩票提供了几场平局游戏,其中两场是选3和选4。在0和9(含9)之间分别选择3或4位数字,数字可以重复(例如,9-9-9是有效的组合)。在这个例子中,我将使用Pick3,因为它更容易使用,但我试图使它成为一个通用的解决方案,可以使用任何数量的数字。 选3和选4的一个特点是“1选1”,这意味着如果至少有一个号码比你的票上的号码高1或低1,你就赢了一个奖。