5 solutions
-
0
题目描述:塔子哥正在设计一个二维平面音游,其中有一个由 (H) 个水平方块和 (V) 个垂直方块组成的网格。每个方块的方块组是指与该方块相邻的所有方块及它自己,垂直方向的方块是首尾相连的。给定一个方块的 (ID),要求输出该方块组中的所有方块 (ID),并按照从上到下、逆时针排列的顺序,最后输出的方块 (ID) 放在组的末尾。
输入格式:第一行包含三个正整数 (H), (V), (M)。接下来的 (M) 行,每行输入一个方块的 (ID)。
输出格式:对于每个输入的方块 (ID),输出对应的方块组,方块 (ID) 以空格分隔。
思路
在这个问题中,我们需要处理的是一个由 ( n ) 行和 ( m ) 列组成的网格,方块的 ID 从 0 到 ( n × m - 1 )。我们的任务是为每个给定的方块 ID 计算它的方块组,即它自己及其周围的方块 ID。
是否构图
首先,我们观察到,给定 ( n ) 和 ( m ) 后,整个图形的结构是固定的。也就是说,方块的相对位置不随时间改变,因此我们不需要动态地构建整个网格,只需通过数学运算来定位方块及其邻居。
如何查询
对每个方块 ID ( x ) 的处理逻辑如下:
-
垂直方向:
- 上方方块的 ID 可以表示为 ( x - n ),下方方块的 ID 表示为 ( x + n )。
- 由于垂直方向上是首尾相连的,我们可以通过对 ( x - n ) 和 ( x + n ) 进行调整来处理边界情况。具体来说:
- 如果 ( x - n < 0 ),则我们需要加上 ( n × m )。
- 如果 ( x + n >= n × m ),则我们需要减去 ( n × m )。
- 为了简化这些操作,我们可以直接将这两个表达式加上 ( n × m ),再取模 ( n × m ) 来确保结果在有效范围内。
-
水平方向:
- 水平方向的处理相对简单,因为它并不是首尾相连的。我们只需检查 ( x - 1 ) 和 ( x + 1 ) 是否在合法范围内:
- ( x - 1 ) 必须检查 ( x ) 是否在当前行的最左侧(即 ( x % n != 0 ))。
- ( x + 1 ) 必须检查 ( x ) 是否在当前行的最右侧(即 ( (x + 1) % n != 0 ))。
- 水平方向的处理相对简单,因为它并不是首尾相连的。我们只需检查 ( x - 1 ) 和 ( x + 1 ) 是否在合法范围内:
时间复杂度分析
对于每个方块 ID 的查询,我们的算法在常数时间内 ( O(1) ) 计算出它的方块组。由于需要处理 ( k ) 个查询,总的时间复杂度为 ( O(k) )。
代码
CPP
python
Java
Go
Js
-
- 1
Information
- ID
- 28
- Time
- 1000ms
- Memory
- 256MiB
- Difficulty
- 3
- Tags
- # Submissions
- 488
- Accepted
- 97
- Uploaded By