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

news2024/11/18 2:46:27

卫星地图

题目描述

一张矩形的卫星地图,有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; j++) {
            if (a[j][i] >= 2)
                cnc++;
            else
                cnc = 0;
            cncm = max(cncm, cnc);
        }
        c[cncm]++;
        cncm = 0, cnc = 0;
    }
    for (it = c.begin(); it != c.end(); it++) {
        if (it->first >= 2 && it->second != 0)
            cout << "C"
                 << " " << it->first << " " << it->second << endl;
    }
}

这个代码的计算顺序是S—L—C,最初始的思路是将已经计算过的格子标记为2,但是这篇代码漏洞百出
1.在计算C建筑的时候,m和n搞反了。
2.忽略了同一列或行上有两种同样的建筑的情况,本片代码直接取最大值,所以WA了。

第二遍代码——40分

#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] != 1 && a[i + 1][j] != 1 && a[i][j - 1] != 1 && a[i][j + 1] != 1 && a[i][j] == 1)
                cns++, a[i][j] = 2;
    if (cns != 0)
        cout << 'S' << " " << cns << endl;
    for (i = 1; i <= n; i++) {
        for (j = 1; j <= m; j++) {
            if (a[i][j] == 1)
                cnl++;
            else
                cnl = 0;
            cnlm = max(cnlm, cnl);
        }
        if (cnlm != 0)
            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; j++) {
            if (a[j][i] == 1)
                cnc++;
            else
                cnc = 0;
            cncm = max(cncm, cnc);
        }
        if (cncm != 0)
            c[cncm]++;
        cncm = 0, cnc = 0;
    }
    for (it = c.begin(); it != c.end(); it++) {
        if (it->first >= 2 && it->second != 0)
            cout << "C"
                 << " " << it->first << " " << it->second << endl;
    }
}

改动:
1.在给map赋值时,加了cnt!=0的条件,但本质上一样。
2.在S建筑输出的时候,加了!=0的条件,这样在没有这种建筑的时候不输出。

这时候,整体程序的思路和判断条件都有些复杂
这是50分的代码,改变了顺序为了方便标记,但后来发现可以用更简单的代码

#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][j]==1&&(a[i][j+1]!=0||a[i][j-1]!=0))
				cnl++,a[i][j]=2;
			else cnl=0;
			cnlm=max(cnlm,cnl);
		}
		if(cnlm!=0)l[cnlm]++;
		cnlm=0,cnl=0;
	}
	for(i=1;i<=m;i++){
		for(j=1;j<=n;j++){
			if(a[j][i]==1&&(a[j+1][i]!=0||a[j-1][i]!=0)) 
				a[j][i]=2,cnc++;
			else cnc=0;
			cncm=max(cncm,cnc);
		}
		if(cncm!=0)c[cncm]++;
		cncm=0,cnc=0;
	}
	for(i=1;i<=n;i++)
		for(j=1;j<=m;j++)
			if(a[i][j]==1)
				cns++;
	if(cns!=0)  cout<<'S'<<" "<<cns<<endl;
	
	for(it=l.begin();it!=l.end();it++){
		if(it->first>=2&&it->second!=0)
			cout<<"L"<<" "<<it->first<<" "<<it->second<<endl;
	}	
	
	for(it=c.begin();it!=c.end();it++){
		if(it->first>=2&&it->second!=0)
			cout<<"C"<<" "<<it->first<<" "<<it->second<<endl;
	}
}

我的100分代码,略有冗长

#include <bits/stdc++.h>
using namespace std;
map<int, int> l, c;                                                              //map用来存储l建筑和c建筑的数据
map<int, int>::iterator it;
int a[1005][1005], cnt, cntm, 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++) {                                                    //判断l
        for (j = 1; j <= m; j++) {
            if (a[i][j] == 1 && (a[i][j + 1] != 0 || a[i][j - 1] != 0))           //如果为1且前后为1,则满足条件,为了避免是s建筑的情况
                cnt++, a[i][j] = 2;                                               //如果满足,将当前位置做标记,并且cnt++;
            else {
                if (cnt >= 2)                                                     //否则需要把现有值也存储进map中,这是为了避免同一行或同一列出现两个同样建筑的情况
                    l[cnt]++;
                cnt = 0;                                                          //当前值为0,说明不连续,cnt就可归0
            }                                            
        }
        if (cnt >= 2)                                                             //行末或列末为1情况单独判断
            l[cnt]++;
        cnt = 0;
    }

    for (i = 1; i <= m; i++) {                                                    //判断c
        for (j = 1; j <= n; j++) {
            if (a[j][i] == 1 && (a[j + 1][i] != 0 || a[j - 1][i] != 0))           //c是列,所以需要把i,j反过来
                a[j][i] = 2, cnt++;                                         
            else {
                if (cnt >= 2)
                    c[cnt]++;
                cnt = 0;
            }
        }
        if (cnt >= 2)
            c[cnt]++;
        cnt = 0;
    }

    for (i = 1; i <= n; i++)                                                       //判断s
        for (j = 1; j <= m; j++)
            if (a[i][j] == 1)                                                      //因为前两种都标记了,所以不需要附加条件
                cnt++;
    if (cnt != 0)                                                                  //题目要求为0不输出
        cout << 'S' << " " << cnt << endl;                                  

    for (it = l.begin(); it != l.end(); it++) {          
        if (it->second != 0)                                                       //用map迭代器输出,长度不为0
            cout << "L" << " " << it->first << " " << it->second << endl;
    }

    for (it = c.begin(); it != c.end(); it++) {
        if (it->second != 0)
            cout << "C" << " " << it->first << " " << it->second << endl;
    }
}

在判断条件上做了更改,这样就避免了20分代码中同一列或行上有两种同样的建筑的情况,写上注释是为了找错,(神奇的是,一写注释就过了)

大家一起优化的代码

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/192227.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

春节机票销售大增!航空领域哪些业务风险要注意?

目录 航空领域常见的业务风险 2022年航空业务风险趋势分析 航空领域业务风险欺诈分析 如何防范航空业务风险 针对恶意网络爬虫 针对仿冒登录与内控风险 安全技术 春节旅游与出行数据陆续出炉。中国民航局数据显示&#xff0c;2023年1月21日至27日&#xff08;农历除夕至…

Linux - Linux系统

一、Linux系统Linux&#xff0c;全称GNU/Linux。Linux是一个开源、免费的操作系统&#xff0c;其稳定性、安全性、处理多并发能力已经得到业界的认可&#xff0c;目前大多数企业级应用甚至是集群项目都部署运行在linux操作系统之上&#xff0c;很多软件公司考虑到开发成本都首选…

CnOpenData中国核酸检测机构及采样点数据

一、数据简介 2020年1月21日&#xff0c;国家卫健委发布1号公告&#xff0c;将新型冠状病毒感染的肺炎纳入《中华人民共和国传染病防治法》规定的乙类传染病&#xff0c;并采取甲类传染病的预防、控制措施。目前&#xff0c;新型冠状病毒肺炎防控仍处于关键阶段&#xff0c;核酸…

ThinkPHP6 文件上传

内置文件上传使用\think\facade\Filesystem类封装方法 目录 简单上传 public存储文件 文件验证 命名规则 使用sha1 使用MD5 使用date 指定文件名称 自定义命名规则 更多上传设置 总结 简单上传 直接上传&#xff0c;使用默认上传设置 $savename \think\facade\F…

业务平台扩展支持TDengine时序数据库方案

1 场景与架构 1.1业务架构 这里涉及项目隐私&#xff0c;架构图不方便公开。 大致情况就是&#xff1a; 应用层的园区畅行、生态宜居、安全守护是我方要交付的系统。 平台层的物联网感知中台是我方平台。 1.2数据架构 从数据架构看&#xff0c;园区畅行…

第四章 git分支操作

4.1什么是分支 在版本控制过程中&#xff0c;同时推进多个任务&#xff0c;为每个任务&#xff0c;我们就可以创建每个任务的单独 分支。使用分支意味着程序员可以把自己的工作从开发主线上分离开来&#xff0c;开发自己分支的时 候&#xff0c;不会影响主线分支的运行。对于初…

优化器-RBO 的规则转化

一、RBO 背景介绍RBO&#xff08;Rule-Based Optimization&#xff0c;基于规则的优化器&#xff09;有着一套严格的使用规则&#xff0c;按照 RBO 去写 SQL 语句&#xff0c;无论数据表中的内容怎样&#xff0c;也不会影响到你的“执行计划”。换言之 RBO 对数据不“敏感”&am…

码元,码元速率,波特率,比特率(个人理解总结)

参考&#xff1a;https://baike.baidu.com/item/%E7%A0%81%E5%85%83%E4%BC%A0%E8%BE%93%E9%80%9F%E7%8E%87/6305673 https://baike.baidu.com/item/%E7%A0%81%E5%85%83%E9%80%9F%E7%8E%87/10945076 https://baike.baidu.com/item/%E6%9B%BC%E5%BD%BB%E6%96%AF%E7%89%B9%E7%BC%9…

低代码:如何成为企业业务价值提升的一大利器?

首先&#xff0c;来看低代码能为企业带来什么&#xff1f; 低代码开发能够增加软件所创造的价值&#xff0c;帮助企业机构衡量企业级低代码平台的价值并计算它将会产生的影响。 低代码在企业的现实运用中能为企业带来巨大的经济效益。众所周知&#xff0c;软件可以推动业务价值…

Cesium中的飞线效果-Shader

飞线的顶点着色器坐标系换算较为复杂。代码中的vertexShaderSource部分为cesium源码中附带的顶点着色器。后期增加了一些传参方法。 用到的GLSL的API: attribute vec2 st; 两个分量为 st.s: 飞线的长度(0-1) st.t: 飞线的宽度(0~1) czm_frameNumber 每帧都会自增,用…

metersphere将默认关闭加载的UI服务启动

目录 一、安装 二、配置 selenium-grid 三、下载驱动程序 三、运行驱动程序 四、将本地运行Selenium-server配置到MeterSphere平台 一、安装 /opt/metersphere/.env&#xff0c;有个 ui_enabled属性&#xff0c;改成true, 然后 msctl reload 二、配置 selenium-grid 这里…

pytest自动化测试执行环境切换的两种解决方案

一、痛点分析 在实际企业的项目中&#xff0c;自动化测试的代码往往需要在不同的环境中进行切换&#xff0c;比如多套测试环境、预上线环境、UAT环境、线上环境等等&#xff0c;并且在DevOps理念中&#xff0c;往往自动化都会与Jenkins进行CI/CD&#xff0c;不论是定时执行策略…

硬盘已删除的数据怎么恢复?磁盘数据恢复,试试这3大方法!

电脑里面的硬盘起着存储安装程序或者保存着重要数据的功能&#xff0c;里面有我们很多数据&#xff0c;比如图片、文件、视频等。 有时遇到一些情况&#xff0c;我们把硬盘里面的重要数据删除了&#xff0c;或者是硬盘被损坏了&#xff0c;我们该怎么办&#xff1f;磁盘数据恢…

基于声学模型共享的零资源韩语识别系统

声学模型共享方法是极低资源小语种语音识别一种解决方案&#xff0c;能够实现不需要任何语音数据的语音识别。本文介绍清华大学语音与音频技术实验室的零资源韩语语音系统&#xff0c;其在不使用任何韩语语音数据的情况下&#xff0c;在Zeroth韩语数据集上的测试CER达到了27.33…

Redis主从架构 | 黑马Redis高级篇

目录 一、搭建主从架构 1、为什么要搭建 2、准备实例和配置 3、启动 4、开启主从关系 二、 数据同步原理 1、全量同步 2、命令传播 3、增量同步 三、常见面试题 一、搭建主从架构 1、为什么要搭建 如果服务器发生了宕机&#xff0c;由于数据恢复是需要点时间&#…

51.Isaac教程--使用强化学习的DollyDocking

使用强化学习的DollyDocking ISAAC教程合集地址: https://blog.csdn.net/kunhe0512/category_12163211.html 文章目录使用强化学习的DollyDocking快速开始推理未来场景工厂多代理场景训练利用训练的模型运行推理Codelets模拟Isaac SDK 中的健身房状态机流程强化学习政策JSON 管…

Jenkins+GitLab自动化部署到Docker容器

JenkinsGitLab自动化部署到Docker容器1、编写Dockerfile2、为测试服务器配置Docker镜像加速器3、Jenkins相关配置3.1 配置测试服务器3.2 Pre Steps配置3.3 Post Steps配置3.4 执行构建本文是对JenkinsGitMaven自动化部署配置这篇文章的补充&#xff0c;有关基本的环境搭建从这篇…

Python的 6 大类数据类型,先收藏再说......

计算机程序&#xff0c;就是对数据进行操作。 无论你学习那种语言开发&#xff0c;都需要学习具体的数据类型&#xff0c; 每种开发语言都有自己不同数据类型。 下面是针对python语言的全部数据类型详细汇总&#xff1a; Python中可以自定义数据类型,可以具有无限种数据类型…

爱普生Epson WF110彩色无线便携式打印机错误E-12维护箱已到使用寿命

基本参数: 产品定位 墨仓式打印机 最高分辨率(dpi) 5760X1440dpi 网络功能 支持无线网络打印

【MySQL】成为MySQL高手必须要知道的MySQL索引

MySQL基础mysql 的查询流程索引是什么呢&#xff1f;MySQL索引优缺点MySQL索引分类上一篇了解到了MySQL安装步骤&#xff0c;接下来就开始学习MySQL索引知识点 mysql 的查询流程 查询流程大致是&#xff1a; mysql 客户端通过协议与 mysql 服务器建连接&#xff0c;发送查询…