【21NOIP提高组】棋局

本文介绍了融合围棋、象棋和军棋元素的棋局游戏规则,并描述了棋子移动的详细条件。玩家需要计算每次放置棋子后,能够到达的位置数量。题目提供输入输出示例及数据范围,适合算法爱好者挑战。
摘要由CSDN通过智能技术生成

【题目描述】
在输了一晚上的麻将之后,小 z 和小 c 卸掉了手机上的所有牌类游戏。不过这怎么可能阻挡得了他们上课颓废的决心呢?现在他们的目光盯在了棋类游戏上,但他们两个除了天天下飞行器以外,几乎所有棋类游戏都只懂个大概规则。

“既然我们都会玩但只能玩一点点,不如我们自己搞个缝合怪出来吧!”

于是,在他们的精心脑洞之下,一个融合了围棋、象棋与军棋的奇妙游戏诞生了……

游戏在一张长 n 行宽 m 列的网格形棋盘上进行,棋子落在网格的交叉点上。我们不妨记左上角的交叉点的坐标为 (1, 1) ,右下角的交叉点坐标为 (n, m) 。

棋子分为黑白两色,对局双方各执一方棋子。

每个棋子除了颜色以外还有等级,不妨设 coli 为棋子 i 的颜色,lvi 为棋子 i 的等级。另外,棋盘上的网格线共有 4 种状态,对于第 i 条网格线,设其状态为 opti 。

轮到每方下棋时,他可以选择棋盘上的一个己方棋子沿网格线进行移动到另一个交叉点,称为走子。形式化定义走子的过程如下:选择一个坐标序列 (x0, y0),(x1, y1), ...,(xk, yk),其中 k 是任意选定的正整数,(x0, y0) 是棋子初始的位置,(xk, yk) 是棋子最终走到的位置,需要满足:

• 对于任意 i=0,1,...,k−1 ,坐标 (xi, yi) 和 (xi+1, yi+1) 之间必须有网格线直接相连,也就是说走子必须沿着网格线走 ;

• 对于任意 i ≠ j ,必须有 (xi, yi) ≠  (xj, yj ) ,也就是说走子过程中不能经过重复位置,特别地 (x0, y0)≠ (xk, yk) ,也就是说不能原地不动(或走回原地) 。

• 对于任意 i=1,...,k−1,坐标 (xi, yi) 上必须没有棋子,也就是说走子时不能越过已有的棋子 。

• 若 (xk, yk) 上没有棋子,称为普通走子,否则称为吃子。在吃子过程中,设正在走的棋子颜色为 col1 ,等级为 lv1 ,被吃的棋子颜色为 col2 ,等级为lv2 ,则必须满足 col1 ≠ col2, lv1 ≥ lv2 ,换句话说只能吃与自己颜色不同, 且等级不高于自己等级的 棋子 。

需要注意的是,由上述定义可以得出,不允许棋子在吃子后继续向前走。

网格线的状态含义如下所述:

• 如果 opti=0 ,代表此路不通,走子时不能经过这条网格线。

• 如果 opti=1 ,代表这条网格线是一条“普通道路”,每次走子时棋子最多只能经过 1 条普通道路。

• 如果 opti=2 ,代表这条网格线是一条“直行道路”,每次走子时棋子可以经过任意条直行道路,但只能一直沿横向或一直沿纵向走,不能转弯。如沿直行道路从(1,1) 经过 (1,2) 走到 (1,3) 是可以的,但是从 (1,1) 经过 (1,2) 走到 (2,2) 不行。

• 如果 opti=3 ,代表这条网格线是一条“互通道路”,每次走子时棋子可以经过任意条互通道路,且中途可任意转弯。

同时规定在一次走子过程中,棋子经过的网格线的状态必须全部相同,比如从 (1,1)经过直行道路走到 (1,2) 再经过互通道路走到 (1,3) 是不允许的。

至于如何判断胜负等其他细节,与本题无关,故略去。

小 z 和小 c 开发出这款棋类游戏后,为了提升水平,想了一个训练的策略:一开始棋盘是空的,然后小 c 会每次往棋盘的某个空交叉点上放一枚棋子,小 z 需要快速计算出:若选择这枚新放上的棋子进行一次走子,棋盘上一共有多少个位置是能被走到的?注意,因为这只是思维训练,他们并不会真的走这枚棋子。

可怜的小 z 发现他的计算力不足以算出这个问题,只好向你求助。

【输入】
每个测试点由多组数据组成。

第一行:一个正整数 T 表示数据组数。

对于每组数据:

第一行:3 个正整数 n, m, q ,分别表示棋盘的行数、列数和游戏的轮数。

接下来 n 行,每行为一个长 m−1 的字符串,每个字符为 0、1、2、3 中的一个,第 i 行第 j 个字符表示交叉点 (i,j) 连向交叉点 (i,j+1) 的网格线状态。

接下来 n−1 行,每行为一个长 m 的字符串,每个字符为 0、1、2、3 中的一个,第 i 行第 j 个字符表示交叉点 (i,j) 连向交叉点 (i+1,j) 的网格线状态。

接下来 q 行,每行 4 个非负整数 coli,lvi,xi,yi ,表示在第 i 轮有一枚颜色为 coli ,

等级为 lvi 的棋子放在了交叉点 (xi, yi) 上。其中 coli=0 表示黑子,coli=1 表示白子。

保证之前交叉点 (xi, yi) 上没有棋子。

【输出】
对于每组数据输出 q 行,每行一个非负整数,表示第 i 枚棋子放置后能走到的交叉点数量。

【输入样例】
1
3 3 5
13
22
23
010
233
0 1 2 3
1 2 2 1
1 3 1 2
0 2 3 2
1 3 2 2
【输出样例】
4
3
3
3
2
【提示】
【样例 1 解释】

放置棋子 1 后,它能走到的位置为 (2, 1),(2, 2),(3, 2),(3, 3) 。

放置棋子 2 后,它能走到的位置为 (2, 2),(2, 3),(3, 1) 。

放置棋子 3 后,它能走到的位置为 (1, 1),(1, 3),(2, 2) 。

放置棋子 4 后,它能走到的位置为 (2, 2),(3, 1),(3, 3) 。

放置棋子 5 后,它能走到的位置为 (2, 3),(3, 2) 。

【样例 2 输入】

2
2 3 4
22
33
123
0 2 1 2
0 1 2 1
1 2 1 3
0 3 2 2
3 2 3
3

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值