2008NOIP普及组真题 4. 立体图

news2025/1/11 10:56:49
线上OJ:

一本通-1977:【08NOIP普及组】立体图

核心思想:

本题采用模拟方法一个一个画小方块(虽然画的是立体空间的积木,但本质还是在二维平面上画图形
本题的难点在于:
1、如何确定二维平面画布的大小(画布的高 h 对应二维平面的行向量,画布宽度L对应二维平面的列向量)
2、如何确定每个积木的起点坐标左下角作为起点)
3、如何处理遮挡

观察难点1(如下图):

在这里插入图片描述

答:我们发现,画布的宽度 L = 1 + 4 ∗ n + 2 ∗ m L = 1 + 4*n + 2*m L=1+4n+2m; 画布的高度 h = m a x ( h , 1 + 3 ∗ a [ i ] [ j ] + 2 ∗ ( m − i + 1 ) ) h = max(h, 1 + 3 * a[i][j] + 2 * (m-i+1)) h=max(h,1+3a[i][j]+2(mi+1))

观察难点2(如下图):

在这里插入图片描述

答:我们发现:第 i 行第 j 列的矩形的左下角顶点位于画板的第 h − ( m − i ) ∗ 2 h - ( m - i ) * 2 h(mi)2 行,第 1 + ( j − 1 ) ∗ 4 + ( m − i ) ∗ 2 1 +( j - 1 ) * 4 + ( m - i) * 2 1+(j1)4+(mi)2

观察难点3:

由于前面的遮挡后面的,上面的遮挡下面的,右面的遮挡左面的。所以绘制积木时采用逆向顺序:从后往前画(从第1行到第m行),从左往右画(从第1列到第n列),从下往上画(此时只要行索引每次-3即可,如下图所示)
在这里插入图片描述

题解代码:
#include <iostream>
using namespace std;

int m, n, l, h;
int a[101][101];  // a[i][j] 第i行第j列的区域上方叠放积木的数量
char prt[1001][1001]; // 屏幕画布所对应的二维数组
char box[6][8]=
{
    "..+---+",
    "./   /|",
    "+---+ |",
    "|   | +",
    "|   |/.",
    "+---+..",
};

void draw(int x, int y)
{
    for(int i = 0; i < 6; i++)
        for(int j = 0; j < 7; j++)                             // 传进来的行索引需反向;列索引方向一致,不需要变化
            if(box[i][j] != '.')  prt[x-5+i][y+j] = box[i][j]; // 传进来的x是积木左下角的行索引(第6行),x-1是第5行,x-2是第4行... x-5是第1行
}

int main()
{
    scanf("%d %d", &m, &n);
    l = 1 + 4*n + 2*m;   // 整体图像在“画板”水平区域的宽度
    for(int i = 1; i <= m; i++)  // 从后往前读入 m 行
        for(int j = 1; j <= n; j++) // 从左往右读入 n 列
        {
            scanf("%d", &a[i][j]);
            h = max(h, 1 + 3 * a[i][j] + 2 * (m-i+1)); // 整体图像在“画板”垂直区域的高度
        }

    for(int i = 1; i <= h; i++)  // 高度对应数组的行,宽度对应数组的列
        for(int j = 1; j <= l; j++)  prt[i][j] = '.'; // 全初始化为背景的‘.’

    for(int i = 1; i <= m; i++)
    {
        for(int j = 1; j <= n; j++)
        {
            int x, y;  // 因为共有m行n列个区域。(x,y) 表示第i行第j列区域的左下角在“画板”上对应的行索引和列索引
            x = h - 2 * (m-i);
            y = 4 * (j-1) + 2 * (m-i) + 1;
            while(a[i][j]--) // 叠加了几块积木,就画几次
            {
                draw(x, y);  // 叠加的积木,每高一层,左下角顶点坐标在画布上的行索引少3
                x -= 3;
            }
        }
    }

    for(int i = 1; i <= h; i++)
    {
        for(int j = 1;j <= l; j++)
            printf("%c", prt[i][j]);

        printf("\n");
    }

    return 0;
}

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

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

相关文章

传输层之 TCP 协议

TCP协议段格式 源/目的端口号&#xff1a;表示数据是从哪个进程来&#xff0c;到哪个进程去。 序号&#xff1a;发送数据的序号。 确认序号&#xff1a;应答报文的序号&#xff0c;用来回复发送方的。 4 位首部长度&#xff1a;一个 TCP 报头&#xff0c;长度是可变的&#xff…

产品想在网络媒体上做营销宣传推广有什么好方法?

作为公司宣传负责人,我深知产品在网络媒体上的营销推广对于品牌建设和市场扩张的重要性。然而,在过去,当我们想要在网络媒体上推广产品时,我面临了诸多挑战和困境。 以前,我常常需要直接联系各大网络媒体,从海量的信息中筛选出合适的媒体平台,然后逐一发送邮件、拨打电话甚至亲…

图片无损压缩工具-VIKY

一、前言 Viky v3.4是一款功能强大的图片压缩工具&#xff0c;它能够提供高效的图片无损压缩服务。通过使用独特的压缩算法&#xff0c;该软件在显著减小图片文件大小的同时&#xff0c;还保持了图像的清晰度和色彩饱和度&#xff0c;确保了图像质量的优异表现。 二、软件特点…

layui select 绑定onchange事件失效

layui select 绑定onchange事件失效 问题背景解决方案 问题背景 在日常工作中&#xff0c;可能会用到页面 freemaker 以及 layui 前端框架&#xff0c;这个时候直接在 select 上面绑定 onchange 事件往往是不生效的&#xff0c;错误的方式 这种方式给 select 绑定的 onchange…

深入浅出JavaScript继承机制:解密原型、原型链与面向对象实战攻略

&#x1f525; 个人主页&#xff1a;空白诗 文章目录 &#x1f525; 引言&#x1f9f1; 原型基础⛓️ 原型链的形成&#x1f504; 修改原型的影响&#x1f3c1; 原型链的尽头为什么null标志着结束&#xff1f;实际意义 &#x1f310; &#x1f504; 继承的实现方式1. 原型链继承…

【ITK配准】第十九期 基于KernelBase样条的图像变形

很高兴在雪易的CSDN遇见你 VTK技术爱好者 QQ:870202403 公众号:VTK忠粉 前言 本文分享ITK配准中基于KernelBase样条的图像变形,希望对各位小伙伴有所帮助! 感谢各位小伙伴的点赞+关注,小易会继续努力分享,一起进步! 你的点赞就是我的动力(^U^)ノ~YO 基于…

VMware虚拟机中Linux系统奔溃,怎么办?

一大早启动虚拟机准备开始工作&#xff0c;却遭遇到Linux系统崩溃&#xff0c;屏幕上显示以下错误提示&#xff1a; 这段文本看起来是来自系统引导时的日志信息&#xff0c;提到了一些关于文件系统的问题和建议。根据这段信息&#xff0c;似乎 /dev/sda1 分区中的文件系统存在一…

鲁教版六年级数学上册-笔记

文章目录 第一章 丰富的图形世界1 生活中的立体图形2 展开和折叠3 截一个几何体4 从三个方向看物体的形状 第二章 有理数及其运算1 有理数2 数轴3 绝对值4 有理数的加法5 有理数的减法6 有理数的加减混合运算7 有理数的乘法8 有理数的除法9 有理数的乘方10 科学计数法11 有理数…

探索无界知识:用 ChatGPT 的原理学习任何事物!

为避免文章重复&#xff0c;您的文本已通过更改句式、用词以及句子结构进行了修改。现在的文本应该能更好地满足去重的需求&#xff1a; 从ChatGPT原理出发&#xff0c;我们探讨GPT如何启发人类学习和构建个人知识体系。 1. 明确学习目标 机器学习必须依靠目标函数。同样&…

4.nginx.pid打开失败以及失效的解决方案

一. nginx.pid打开失败以及失效的解决方案 1.错误图片&#xff1a; 2.解决方法 步骤1&#xff1a;进入这个目录 /var/run/nginx,提示没有文件或目录&#xff0c;则使用mkdir创建这个目录。 步骤2&#xff1a;然后 ./nginx -s reload 运行,是一个无效的PID 步骤3&#xff1a;使…

如何挑选“好用”的工业APP

我们日常生活中每天都在使用各种生活类的APP,然而&#xff0c;当我们谈到工业APP时&#xff0c;很多人可能并不那么熟悉。工业APP&#xff0c;虽然不像生活类APP那样直接面向广大消费者&#xff0c;但在工业领域却扮演着至关重要的角色。 先简单认识下啥是工业APP? 工业APP是…

springboot增删改查

我的记录 RestController RequestMapping("/user") public class UserController {Autowiredprivate UserService userService;GetMapping("/list")public List<User> list(){return userService.list();}//新增PostMapping("/save")publi…

java JMH 学习

JMH 是什么&#xff1f; JMH&#xff08;Java Microbenchmark Harness&#xff09;是一款专用于代码微基准测试的工具集&#xff0c;其主要聚焦于方法层面的基准测试&#xff0c;精度可达纳秒级别。此工具由 Oracle 内部负责实现 JIT 的杰出人士编写&#xff0c;他们对 JIT 及…

热爱电子值得做的电子制作实验

加我zkhengyang&#xff0c;进嵌入式音频系统研究开发交流答疑群(课题组) AM/FM收音机散件制作&#xff0c;磁带随声听散件&#xff0c;黑白电视机散件制作&#xff0c;功放散件制作&#xff0c;闪光灯散件制作&#xff0c;声控灯散件&#xff0c;等等&#xff0c;可提高动手能…

Android 按钮Button点击音效

一、新建工程 编译运行&#xff0c;确保工程无误&#xff0c;这里不过多赘述。 二、UI布局 添加两个播放音效Button <?xml version"1.0" encoding"utf-8"?> <LinearLayout xmlns:android"http://schemas.android.com/apk/res/android"…

笔试强训week4

day1 Q1 难度⭐⭐ 小易的升级之路_牛客题霸_牛客网 (nowcoder.com) 题目&#xff1a; 小易经常沉迷于网络游戏.有一次,他在玩一个打怪升级的游戏,他的角色的初始能力值为 a.在接下来的一段时间内,他将会依次遇见n个怪物,每个怪物的防御力为b1,b2,b3...bn. 如果遇到的怪物防…

Jetpack Compose一:初步了解Compose

Intellij IDEA构建Android开发环境 IntelliJ IDEA 2023.2.1 Android开发变化 IDEA配置使用Gradle 新建Compose工程&#xff0c;取名ComposeStudy 可以看到的是IDEA为项目初始化了部分代码 使用Compose开发不再需要使用xml文件来设计布局了 Compose中的Text也不同于Android V…

【数据结构】手把手带你玩转线性表

前言&#xff1a; 哈喽大家好&#xff0c;我是野生的编程萌新&#xff0c;首先感谢大家的观看。数据结构的学习者大多有这样的想法&#xff1a;数据结构很重要&#xff0c;一定要学好&#xff0c;但数据结构比较抽象&#xff0c;有些算法理解起来很困难&#xff0c;学的很累。我…

windows安装mysql8.0.36

MySQL :: Download MySQL Installer (Archived Versions)下载地址在上面选择一个版本&#xff0c;任意版本&#xff0c;有个小要求&#xff0c;8以上哦&#xff0c;是mysql windows安装版本 接下来是完整的流程操作 下载好就是这个样子 选择安装 在一个盘符中创建文件夹&…

英语学习笔记8——What‘s your job?

What’s your job? 你是做什么工作的&#xff1f; 词汇 Vocabulary policeman 男警察 policewoman 女警察 police n. 警力 集合名词&#xff0c;永表复数 西方国家警察管的事很多。交警&#xff0c;刑警&#xff0c;武警一般不分开。 taxi driver 出租车司机 taxi / cab n.…