1 条题解

  • 0
    @ 2026-6-19 10:30:17

    📝 题目大意

    给定一个 H×WH \times W 的网格,每个格子为 .(空)或 #(箱子)。对于每一列 jj,统计该列中 # 的个数 XjX_j,并依次输出 X1,X2,,XWX_1, X_2, \dots, X_W

    💡 解题思路

    1. 题目分析

      • 约束条件 1H,W10001 \leq H, W \leq 1000,网格最多 10610^6 个格子,直接遍历即可在 O(HW)O(HW) 内完成。
      • 输入格式为每行一个长度为 WW 的字符串,无空格分隔,直接按字符串读入即可。
    2. 算法推导

      • 读入 H,WH, W 后,逐行读入字符串 s[i]s[i](std.cpp 中从下标 11 开始存储)。
      • 定义数组 x[1W]x[1 \dots W](初始为 00),用于统计各列的 # 数量。
      • 外层循环遍历列 jj,内层循环遍历行 ii:若 s[i][j]=s[i][j] = '#',则 x[j]x[j]+1x[j] \gets x[j] + 1
      • 每列统计完后立即输出 x[j]x[j],末尾带空格。
    3. 边界与细节

      • 题目保证 H,W1H, W \geq 1,无需处理空网格。
      • 字符数组开 N=1100N = 1100(略大于 10001000),避免越界。
      • 字符串下标从 11 开始存储,方便与行列编号对应。
      • 输出时每个 XjX_j 后跟一个空格(包括最后一个),AtCoder 的评测系统会自动忽略行末空格,不会导致 WA。

    ⏱️ 复杂度分析

    • 时间复杂度O(HW)O(HW),即遍历网格中所有格子一次。
    • 空间复杂度O(HW)O(HW),用于存储网格字符,外加 O(W)O(W) 的计数数组。

    💻 标准代码 (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
    上传者