[语言月赛202302] 风神瞳 题解

· · 题解

Source & Knowledge

2023 年 2 月语言月赛,由洛谷网校入门计划/基础计划提供。

文字题解

题目大意

给定一个棋盘,规定 (x, y) 代表棋盘上的第 x 行第 y 列。棋盘上只有两个棋子,分别在 (x _ 0, y _ 0)(x _ 1, y _ 1)。给定第一枚棋子的种类,询问能够在仅操作一步的情况下,让第一枚棋子吃掉第二枚棋子。保证第一枚棋子和第二枚棋子不重合。

解析

本题考察对于分支结构的复杂运用。

首先补充一个问题,对于变量名 y0, y1, yn,在 math.h 头文件中有定义三个同名的函数,用于求第二类贝塞尔函数解,相关资料可以在 https://www.ibm.com/docs/en/zos/2.3.0?topic=functions-y0-y1-yn-bessel-second-kind 中查阅。因此在题目中使用这些变量名有可能会造成冲突,进而导致编译错误。

因此以下解析我们使用 a, b, c, d 代替 x _ 0, y _ 0, x _ 1, y _ 1

我们首先需要对棋子种类 p 进行判断,之后做出相应的操作。这个过程使用 if 语句完成。

本题用到的结构为:

if (某某条件) {
    // 达到这个条件时需要做的事情
} else {
    // 否则需要做的事情
} 

具体的控制流可以参考 https://www.runoob.com/cplusplus/cpp-decision.html,由于篇幅限制这里不再做过多的描述。

棋子种类 p 判断的具体结构可以如下:

if (p == 1) { /*...*/ }
else if (p == 2) { /*...*/ }
else if (p == 3) { /*...*/ }
else { /*...*/ }

对于棋子种类,我们进行如下分类讨论:

  1. 由于一次操作下车可以沿行或者列移动,因此此时只需要判断第一枚棋子和第二枚棋子的行坐标和列坐标是否有任意一个相同。

    具体的,我们只需要判断 a == c || b == d 是否成立即可。其中 || 称为逻辑或运算符,代表符号两边的条件只要有一个成立则整个成立。如果上述式子成立则输出 Yes,否则输出 No

  2. 由题面,炮如果想要吃子,那么直线上的炮与对方棋子的中间必须有一个另外的棋子。然而棋盘上只有两枚棋子,因此炮无论如何都吃不掉对方的棋子。此时直接输出 No 即可。

  3. 马走日,这里提供一种比较简单的判断方式。

    我们使用两个变量 e, f 分别记录 |a - c||b - d|。当且仅当 ef 中有一个等于 1 另一个等于 2,马才可以吃掉对方棋子,输出 Yes,否则马不可以吃子,输出 No

  4. 象走田,这里提供一种与马类似的判断方式。

    我们使用两个变量 e, f 分别记录 |a - c||b - d|。当且仅当 ef 均等于 2,象才可以吃掉对方棋子,输出 Yes,否则象不可以吃子,输出 No

视频题解

完整代码请在视频中查看。