1 条题解
-
0
📝 题目大意
在一个 的网格中,格子按同心环交替涂成黑色和白色(最外圈为黑色)。给定行号 和列号 ,输出该格子的颜色。
💡 解题思路
-
题目分析:
- 网格大小固定为 ,,数据量极小,无需担心效率。
- 图中颜色呈同心环分布:最外层(第 1 圈)为黑色,向内第 2 圈为白色,第 3 圈为黑色……以此类推,颜色随圈数奇偶交替。
- 关键洞察:一个格子处于第几圈,取决于它到四条边界的最短距离。
-
算法推导:
- 定义 ,即格子到上、下、左、右四条边界的最近距离(以格数计, 和 从 1 开始)。
R:距离上边界的距离C:距离左边界的距离16 - R:距离下边界的距离(因为最下行是 15,)16 - C:距离右边界的距离
- 的取值代表该格子所在的"圈号": 是最外圈, 是次外圈,以此类推,最内圈(中心点 )的 。
- 根据图示,最外圈()为黑色,因此规则为:圈号为奇数 → 黑色,圈号为偶数 → 白色。
- 即判断
a % 2 == 1:若成立输出"black",否则输出"white"。
- 定义 ,即格子到上、下、左、右四条边界的最近距离(以格数计, 和 从 1 开始)。
-
边界与细节:
- 输入 均为 1-indexed,
16-R和16-C的计算方式依赖于此。 - 中心点 的 (偶数),输出
white,与图示一致。 - 注意输出大小写严格区分:
black/white均为小写。
- 输入 均为 1-indexed,
⏱️ 复杂度分析
- 时间复杂度:,仅常数次比较和取模运算。
- 空间复杂度:,仅使用几个整型变量。
💻 标准代码 (C++)
#include<bits/stdc++.h> using namespace std; int main(){ int r,c; cin >> r >> c; // 计算当前格子到四条边界的最近距离,即所在的"圈号" int a = min({r, c, 16 - r, 16 - c}); // 圈号为奇数 → 黑色,偶数 → 白色 if(a % 2 == 1) cout << "black"; else cout << "white"; return 0; } -
- 1
信息
- ID
- 625
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 10
- 标签
- (无)
- 递交数
- 1
- 已通过
- 1
- 上传者