QOJ.ac

QOJ

実行時間制限: 1 s メモリ制限: 256 MB 満点: 100

#5183. 超级棋子

統計

你拥有一个无限大的棋盘。在这个任务中,棋盘是一个无限的二维方格网,每个方格由一对整数 $(r, c)$ 索引,分别表示行和列。棋盘上当前唯一的棋子是“超级棋子”(superpiece)。你将获得一个超级棋子有效移动方式的列表,该列表由一个包含 "QRBNKP" 字符子集的非空字符串指定。在每一回合中,超级棋子可以按照给定的棋子类型之一进行移动。超级棋子最初位于方格 $(a, b)$。请计算到达方格 $(c, d)$ 所需的最少移动次数。

本题适用的棋子规则子集如下。

共有六种类型的棋子:皇后(queen)、车(rook)、象(bishop)、马(knight)、王(king)和兵(pawn)。它们的移动方式如下:

  • 皇后(用 'Q' 表示)可以移动到与当前所在方格处于同一行、同一列或同一对角线上的任何方格。形式化地,对于任何整数 $k \neq 0$,皇后可以从 $(a, b)$ 移动到 $(a, b + k)$、$(a + k, b)$、$(a + k, b + k)$ 和 $(a + k, b - k)$。
  • (用 'R' 表示)可以移动到与当前所在方格处于同一行或同一列上的任何方格。形式化地,对于任何整数 $k \neq 0$,车可以从 $(a, b)$ 移动到 $(a + k, b)$ 和 $(a, b + k)$。
  • (用 'B' 表示)可以移动到与当前所在方格处于同一对角线上的任何方格。形式化地,对于任何整数 $k \neq 0$,象可以从 $(a, b)$ 移动到 $(a + k, b + k)$ 和 $(a + k, b - k)$。
  • (用 'N' 表示)可以以“L”形移动:即先沿某个方向移动两格,然后沿垂直方向移动一格。形式化地,马可以从 $(a, b)$ 移动到 $(a + 1, b + 2)$、$(a + 1, b - 2)$、$(a + 2, b + 1)$、$(a + 2, b - 1)$、$(a - 2, b + 1)$、$(a - 2, b - 1)$、$(a - 1, b + 2)$ 和 $(a - 1, b - 2)$。
  • (用 'K' 表示)可以移动到与当前方格直接相邻的八个方格中的任何一个。形式化地,王可以从 $(a, b)$ 移动到 $(a, b + 1)$、$(a, b - 1)$、$(a + 1, b)$、$(a - 1, b)$、$(a + 1, b + 1)$、$(a + 1, b - 1)$、$(a - 1, b + 1)$ 和 $(a - 1, b - 1)$。
  • (用 'P' 表示)可以向上移动恰好一格。形式化地,兵可以从 $(a, b)$ 移动到 $(a + 1, b)$。

请注意,你可能了解的其他国际象棋规则或移动方式在本题中不适用;请仅使用上述列出的规则。 此外,请注意,虽然表示棋子的符号通常是其英文名称的首字母,但“马”(kNight)使用的是第二个字母(以避免与“王”(King)混淆)。

输入格式

输入的第一行包含一个整数 $q$,表示你的程序将被测试的查询数量。接下来的每两行描述一个查询:

  • 查询的第一行包含一个非空字符串,指定超级棋子可以模拟的棋子集合。该字符串包含大写字符串 "QRBNKP" 中的字符子集,且包含的字符按相同顺序排列。换句话说,它是 "QRBNKP" 的一个子序列。
  • 查询的第二行包含四个空格分隔的整数 $a, b, c, d$,分别表示超级棋子的起始位置和目标位置。保证 $(a, b) \neq (c, d)$,即起始位置与目标位置不同。

输出格式

对于每个查询,输出一行,包含一个整数 $m$,表示超级棋子从起始位置到达目标位置所需的最少移动次数。如果无法从起始位置到达目标位置,则输出 $-1$。

数据范围

  • $1 \le q \le 1000$
  • $-10^8 \le a, b, c, d \le 10^8$
  • 棋盘在所有方向上都是无限的。

子任务

  • 子任务 1(12 分):每个查询的第一行不包含 'N' 字符,且保证包含 'Q' 字符。
  • 子任务 2(9 分):每个查询的第一行保证包含 'Q' 和 'N' 字符。
  • 子任务 3(13 分):每个查询的第一行不包含 'Q' 字符,且保证包含 'R' 字符。
  • 子任务 4(8 分):每个查询的第一行始终为 "B"。
  • 子任务 5(6 分):每个查询的第一行不包含 'Q' 或 'R' 字符,且保证包含 'B' 字符。
  • 子任务 6(31 分):每个查询的第一行始终为 "N"。
  • 子任务 7(8 分):每个查询的第一行不包含 'Q'、'R' 或 'B' 字符,且保证包含 'N' 字符。
  • 子任务 8(7 分):每个查询的第一行不包含 'Q'、'R'、'B' 或 'N' 字符,且保证包含 'K' 字符。
  • 子任务 9(6 分):每个查询的第一行始终为 "P"。

注意:子任务的顺序并不代表其预期的难度。

样例

样例输入 1

2
NKP
3 3 5 1
NKP
2 6 5 3

样例输出 1

2
2

样例输入 2

2
B
2 8 3 6
B
2 8 5 5

样例输出 2

-1
1

样例输入 3

2
Q
3 3 4 5
QR
4 1 1 4

样例输出 3

2
1

说明

测试用例 1: 在第一个查询中,我们被要求使用马、王和兵的移动方式从 $(3, 3)$ 到达 $(5, 1)$。恰好用 2 步完成的方法有多种,例如: 先作为兵移动到 $(4, 3)$,然后作为马移动到 $(5, 1)$。 先作为马移动到 $(5, 2)$,然后作为王移动到 $(5, 1)$。 * 先作为王移动到 $(4, 2)$,然后再作为王移动到 $(5, 1)$。 没有办法用少于两步完成——我们需要象或皇后才能做到。 在第二个查询中,我们被要求从 $(2, 6)$ 到达 $(5, 3)$。同样,最优解是使用两步。这一次,这两步都必须是马的移动,中间方格为 $(4, 5)$ 或 $(3, 4)$。

测试用例 2: 在第一个查询中,我们被要求从 $(2, 8)$ 到达 $(3, 6)$。仅提供象的移动方式,无法做到这一点。 在第二个查询中,我们被要求从 $(2, 8)$ 到达 $(5, 5)$,同样仅使用象的移动方式。可以在一步内完成。

测试用例 3: 在第一个查询中,我们被要求使用皇后的移动方式从 $(3, 3)$ 到达 $(4, 5)$。可以在两步内完成,例如,以 $(4, 4)$ 作为中间点。 在第二个查询中,我们被要求使用皇后和车的移动方式从 $(4, 1)$ 到达 $(1, 4)$。可以在一步内完成。

Discussions

About Discussions

The discussion section is only for posting: General Discussions (problem-solving strategies, alternative approaches), and Off-topic conversations.

This is NOT for reporting issues! If you want to report bugs or errors, please use the Issues section below.

Open Discussions 0
No discussions in this category.

Issues

About Issues

If you find any issues with the problem (statement, scoring, time/memory limits, test cases, etc.), you may submit an issue here. A problem moderator will review your issue.

Guidelines:

  1. This is not a place to publish discussions, editorials, or requests to debug your code. Issues are only visible to you and problem moderators.
  2. Do not submit duplicated issues.
  3. Issues must be filed in English or Chinese only.
Active Issues 0
No issues in this category.
Closed/Resolved Issues 0
No issues in this category.