卫星地图——MAP(c++)

该文描述了一个关于处理卫星地图的问题,需要识别并统计L型、C型和S型建筑的数量。通过使用map数据结构,对每一行和每一列进行遍历,以找出各种类型建筑的长度和数量。代码中存在错误并经过逐步修正,最终实现正确计算和输出。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

卫星地图

题目描述

一张矩形的卫星地图,有M行N列。行列中的0表示空地,1表示有建筑。有3种类型的建筑:

L型: 仅在一行上占据连续的若干个格子,长度至少为2,至多为N

C型:仅在一列上占据连续的若干个格子,长度至少为2,至多为M

S型:仅占据单个格子。

在同一行上或者同一列上可以出现多个建筑。

不同的建筑不会相邻,相邻是指上,下,左,右,以及左上,左下,右上,右下等八个方向。

求出不同类型的建筑的数量及长度。

输入格式

第1行:2个整数M和N

接下来M行,每行N个0或1,数字之间由空格分开

输出格式

第1行:先输出S,再输出1个整数表示S型建筑的数量,如果没有,则不输出。

接下来若干行,每行依次表示L型建筑的长度以及该长度的建筑数量,按长度递增的顺序输出,中间用一个空格分开,如果没有L型建筑,则不输出。

接下来若干行,每行依次表示C型建筑的长度以及该长度的建筑数量,按长度递增的顺序输出. 中间用一个空格分开,如果没有C型建筑,则不输出。

样例

样例输入

12 12
0 0 0 0 0 0 0 0 0 0 0 1
0 1 1 1 1 1 0 0 0 0 0 1
0 0 0 0 0 0 0 1 0 0 0 1
0 1 0 0 0 0 0 0 0 0 0 0
0 1 0 0 0 0 0 0 0 0 0 0
0 1 0 1 1 1 1 1 1 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 1 0 0 0 0
0 0 0 0 0 0 0 1 0 0 0 0
0 0 0 0 0 0 0 1 0 0 0 0
0 0 0 0 0 0 0 1 0 0 0 0
0 1 1 0 0 0 0 0 0 0 0 0

样例输出

S 1
L 2 1
L 5 1
L 6 1
C 3 2
C 4 1

数据范围与提示

1≤ M,N ≤ 1000

分析

当我们看到这道题后就会想到用map去解决他,因为在计算L建筑和C建筑的时候需要从小到大输出,这时候,我们把建筑的长度作为“键”,把每种建筑的数量作为“值”。
这个题坑很多,这是我第一遍做的代码

第一遍的代码——20

#include <bits/stdc++.h>
using namespace std;
map<int, int> l, c;
map<int, int>::iterator it;
int a[1005][1005], cns, cnl, cnc, cnlm, cncm, n, m, i, j;
int main() {
   
   
    cin >> n >> m;
    for (i = 1; i <= n; i++)
        for (j = 1; j <= m; j++) cin >> a[i][j];
    for (i = 1; i <= n; i++)
        for (j = 1; j <= m; j++)
            if (a[i - 1][j] == 0 && a[i + 1][j] == 0 && a[i][j - 1] == 0 && a[i][j + 1] == 0 && a[i][j] == 1)
                cns++, a[i][j] = 2;
    cout << 'S' << " " << cns << endl;
    for (i = 1; i <= n; i++) {
   
   
        for (j = 1; j <= m; j++) {
   
   
            if (a[i][j] == 1)
                a[i][j] = 2, cnl++;
            else
                cnl = 0;
            cnlm = max(cnlm, cnl);
        }
        l[cnlm]++;
        cnlm = 0, cnl = 0;
    }
    for (it = l.begin(); it != l.end(); it++) {
   
   
        if (it->first >= 2 && it->second != 0)
            cout << "L"
                 << " " << it->first << " " << it->second << endl;
    }
    for (i = 1; i <= n; i++) {
   
   
        for (j = 1; j <= m
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

来自八中的小鹿

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值