P5531 [CCO 2019] Human Error

题目描述

Justin和Donald正在玩一种游戏:跳棋。你可能没有听说过,但是规则非常简单。 棋盘是一个矩形网格,在最开始时,每一格上恰好有一个棋子,并且每名玩家在棋盘上最少拥有一枚棋子。Justin的棋子被标记为`J`,而Donald的被标记为`D`。 Justin先下棋。在一次移动中,这位玩家可以移动自己的一枚棋子并吃掉相邻的一枚棋子 **(不一定是对手的)** ,随后轮到对手。如果当前玩家无法进行这样的操作,那么这位玩家就输了。 棋子$A$与$B$是相邻的,当且仅当$A$正好在$B$的上/下/左/右一格。 在理想的世界中,两人都是绝佳的逻辑学者,可以知晓每种棋盘上的最佳策略。然而这是不现实的。事实上,在游玩时,两人只会选择相对较好的走法。它到底有多好取决于Justin和Donald的误差常数,分别是$J$和$D$。 形式化地,拥有误差常数$A$的玩家会从所有可能的走法中选择其中$A$种组成方案集合。如果所有可能的走法数$ P \le A $,那么方案集合仅包含这$P$种。之后,这位玩家会随机(等概率)地挑选其中的一种并依此进行操作。 两人在挑选方案组成集合时总会选择最优的方案,亦知晓对手也会选择最优方案。 请问Justin获胜的概率是多少?

输入格式

第一行两个正整数,$R C$(用空格隔开)。 之后$R$行,每行$C$个字符,代表初始棋盘上的棋子分布(含义见题目描述)。 之后一行两个正整数,$J D$(用空格隔开),含义见题目描述。

输出格式

一行,一个精确到3位小数的浮点数,代表Justin获胜的概率。

说明/提示

### 限制 $ 1 \le R \times C \le 13 $ $ 1 \le J,D \le 13 $ 初始棋盘棋子分布只用`J`和`D`这两种字符表示。 ### 样例说明 **样例1:** Justin拥有3种移动的可能性,移动后分别为:(用`_`表示空棋子) `_JD`(第一颗向右移),`J_J`(第二颗向右移),`J_D`(第二颗向左移)。 对于情况1,Justin败。对于情况2和3,Justin胜。由于Justin的误差常数为3,他会选择所有的情况,故胜率为$\frac{2}{3}$,取0.667。 **样例2:** Justin拥有4种移动的可能性,移动后分别为:(用`_`表示空棋子) ``` J_ _J J_ _J DD DD DJ JD ``` 然而,无论Justin选择哪种,他都没有可能赢。 之后Donald会选择最优的移动。他可以选择以下的方式击败对应的Justin: ``` D_ _D J_ _J _D D_ _D D_ ``` 故而Justin不可能赢。