1 条题解
-
0
📝 题目大意
给定一个 的网格,每个格子为
.(空)或#(箱子)。对于每一列 ,统计该列中#的个数 ,并依次输出 。💡 解题思路
-
题目分析:
- 约束条件 ,网格最多 个格子,直接遍历即可在 内完成。
- 输入格式为每行一个长度为 的字符串,无空格分隔,直接按字符串读入即可。
-
算法推导:
- 读入 后,逐行读入字符串 (std.cpp 中从下标 开始存储)。
- 定义数组 (初始为 ),用于统计各列的
#数量。 - 外层循环遍历列 ,内层循环遍历行 :若
'#',则 。 - 每列统计完后立即输出 ,末尾带空格。
-
边界与细节:
- 题目保证 ,无需处理空网格。
- 字符数组开 (略大于 ),避免越界。
- 字符串下标从 开始存储,方便与行列编号对应。
- 输出时每个 后跟一个空格(包括最后一个),AtCoder 的评测系统会自动忽略行末空格,不会导致 WA。
⏱️ 复杂度分析
- 时间复杂度:,即遍历网格中所有格子一次。
- 空间复杂度:,用于存储网格字符,外加 的计数数组。
💻 标准代码 (C++)
#include<bits/stdc++.h> using namespace std; #define N 1100 // 略大于 1000 的数组大小,防止越界 char s[N][N]; // 存储网格,下标从 1 开始 int x[N]; // x[j] 表示第 j 列的箱子(#)数量 int main() { int h, w; scanf("%d%d", &h, &w); // 读入高和宽 for(int i = 1; i <= h; i++) { scanf("%s", s[i] + 1); // 从下标 1 开始读入每行字符串 } for(int j = 1; j <= w; j++) // 按列遍历 { for(int i = 1; i <= h; i++) // 遍历该列的每一行 { if(s[i][j] == '#') // 若该格子有箱子 x[j]++; // 对应列计数 +1 } printf("%d ", x[j]); // 输出该列的箱子数,带空格 } return 0; } -
- 1
信息
- ID
- 652
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 10
- 标签
- (无)
- 递交数
- 1
- 已通过
- 1
- 上传者