2 条题解
-
0
📝 题目大意
给定一个 的网格,求格子 的上下左右四个方向中,有多少个格子仍然在网格内部(即存在边相邻的格子)。
💡 解题思路
-
题目分析:,数据量极小,但题目本质是判断四个方向是否越界,与数据范围无关。核心在于:一个格子 的边相邻格子只有四个候选项——上 、下 、左 、右 ,只需逐一检查是否满足 且 。
-
算法推导:在
std.cpp中,,用ans计数:- 上: 时,说明上方还有格子(行号大于 ),
ans++ - 左: 时,说明左侧还有格子(列号大于 ),
ans++ - 下:(即 )时,说明下方还有格子(行号小于 ),
ans++ - 右:(即 )时,说明右侧还有格子(列号小于 ),
ans++
- 上: 时,说明上方还有格子(行号大于 ),
-
边界与细节:
- 角点: 只有右和下两个邻居,答案为 ;若 ,答案为 。
- 边缘:若 或 (即网格退化为一条线),则上下或左右方向必然缺失,符合样例 4~6 的情况。
- 注意
x <= n-1的写法等价于x < n,用<=是为了避免<写成>的笔误,两种写法均可。
⏱️ 复杂度分析
- 时间复杂度:,仅进行四次条件判断。
- 空间复杂度:,只使用常数个变量。
💻 标准代码 (C++)
#include<iostream> using namespace std; int main () { int n, m, x, y; cin >> n >> m >> x >> y; // n=H行, m=W列, x=R行号, y=C列号 int ans = 0; // 符合条件的相邻格子数 if (x > 1) { // 上方有格子(不在第一行) ans++; } if (y > 1) { // 左侧有格子(不在第一列) ans++; } if (x <= n - 1) { // 下方有格子(不在最后一行,等价于 x < n) ans++; } if (y <= m - 1) { // 右侧有格子(不在最后一列,等价于 y < m) ans++; } cout << ans << endl; return 0; } -
- 1
信息
- ID
- 596
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 10
- 标签
- (无)
- 递交数
- 6
- 已通过
- 3
- 上传者