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

线上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);  // 叠加的积木,每高一层,左下角顶点坐标在画布上的行索引少3x -= 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://xiahunao.cn/news/3030250.html

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

相关文章

Spring Boot | Spring Boot 整合“ 邮件任务“ 实现

目录: Spring Boot 整合" 邮件任务" 实现 :一、发送 "纯文本邮件" :(1) 添加 "邮件服务" 依赖启动器(2) 添加 "邮件服务" 配置信息(3) 定制 "邮件发送服务"(4) "纯文本" 邮件发送 测试效果 二、发送 带 "附件…

Redis数据结构-Dict

1.3 Redis数据结构-Dict 我们知道Redis是一个键值型&#xff08;Key-Value Pair&#xff09;的数据库&#xff0c;我们可以根据键实现快速的增删改查。而键与值的映射关系正是通过Dict来实现的。 Dict由三部分组成&#xff0c;分别是&#xff1a;哈希表&#xff08;DictHashTa…

java技术总结

1.java基本数据类型? byte 1,short 2 ,int 4,long 8 ,float 4,double 8,boolean 1,char 2 2.java为什么要有包装类型? 前 6 个类派生于公共的超类 Number,而 Character 和 Boolean 是 Object 的直接子类。 被 final 修饰, Java 内置的包装类是无法被继承的。 包装…

从头理解transformer,注意力机制(上)

深入理解注意力机制和Transformer架构&#xff0c;及其在NLP和其他领域的突破。 要想理解transformer&#xff0c;先从编码器解码器结构开始理解 基于transformer发展起来的llm 右边&#xff1a;只有解码器&#xff0c;强项是生成内容 左边&#xff1a;只有编码器&#xff0…

Ftp笑脸漏洞(VSFTPD 2.3.4)复现(后门漏洞)

Ftp笑脸漏洞&#xff08;VSFTPD 2.3.4&#xff09;复现&#xff08;后门漏洞&#xff09; 一、原理二、复现准备三、漏洞复现四、Metasploit利用脚本复现 一、原理 vsftpd 是“ very secure FTP daemon ”的缩写&#xff0c;安全性是它的一个最大的特点。 vsftpd是一个 UNIX 类…

NSS刷题

1、[SWPUCTF 2021 新生赛]gift_f12 打开题目后查看源码无发现&#xff0c;用f12发现flag 2、[GDOUCTF 2023]hate eat snake 打开链接是一个贪吃蛇小游戏&#xff0c;f12找到js文件中有一个speed的语句&#xff0c;该语句的作用是使速度增加&#xff0c;因此&#xff0c;将该语…

Linux虚拟机运行“yum install gcc-c++”报错“Loading mirror speeds from cached hostfile”

目录 一、在Linux上安装Redis时&#xff0c;在终端执行命令“yum install gcc-c”时&#xff0c;报错&#xff1a; 二、然后发现linux的网络不通&#xff0c;什么网站都访问不了 三、连上网后&#xff0c;再变换yum源 四、重新运行yum install gcc 一、在Linux上安装Redis时…

分布式与一致性协议之MySQL XA协议

MySQL XA协议 概述 相信很多人都知道MySQL支持单机事务&#xff0c;那么在分布式系统中&#xff0c;涉及多个节点&#xff0c;MySQL又是怎样实现分布式事务的呢&#xff1f; 举个例子&#xff0c;一个业务系统需要接收来自外部的指令&#xff0c;然后访问多个内部其他系统来执…

机器学习算法应用——神经网络回归任务、神经网络分类任务

神经网络回归任务&#xff08;4-3&#xff09; 神经网络回归任务&#xff0c;通常指的是使用神经网络模型进行回归分析。回归分析是一种统计学方法&#xff0c;用于研究一个或多个自变量&#xff08;预测变量&#xff09;与一个因变量&#xff08;响应变量&#xff09;之间的关…

【北京迅为】《iTOP-3588开发板从零搭建ubuntu环境手册》-第2章 获取并安装Ubuntu操作系统

RK3588是一款低功耗、高性能的处理器&#xff0c;适用于基于arm的PC和Edge计算设备、个人移动互联网设备等数字多媒体应用&#xff0c;RK3588支持8K视频编解码&#xff0c;内置GPU可以完全兼容OpenGLES 1.1、2.0和3.2。RK3588引入了新一代完全基于硬件的最大4800万像素ISP&…

使用2G内存求20亿个数字中出现次数最多的N个

又是一个TOP -N的题目 我看了一下CSDN上大多数人的回答和GPT说的差不多&#xff0c;都是说使用哈希之类的&#xff1b; 我今天说一下我的解法&#xff0c;首先说一下不太快的基础解法 20亿数字使用uint32需要80GB&#xff0c; &#xff08;1&#xff09;分为40块读取&#…

Apinto下载安装以及集群部署总结

下载 下载官方提供的安装包安装&#xff08;推荐&#xff09; wget https://github.com/eolinker/apinto/releases/download/v0.13.3/apinto_v0.13.3_linux_amd64.tar.gz && tar -zxvf apinto_v0.13.3_linux_amd64.tar.gz && cd apinto 安装 先确保已经入解…

3d如何同时贴两个图在模型上?---模大狮模型网

在3D设计中&#xff0c;为模型贴上纹理或图案是常见的操作&#xff0c;可以使模型更加逼真和生动。然而&#xff0c;有时候我们需要在同一个模型上同时贴上两个不同的图案&#xff0c;这可能会对初学者构成一定的挑战。在本文中&#xff0c;我们将分享一些简单而有效的方法&…

【数学】泰勒公式

目录 引言 一、泰勒公式 1.泰勒公式及推导 &#xff08;1&#xff09;推导 &#xff08;2&#xff09;公式 2.泰勒中值定理 &#xff08;1&#xff09;定理1&#xff08;佩亚诺余项&#xff09; &#xff08;2&#xff09;定理2&#xff08;拉格朗日余项&#xff09; …

【系统架构师】-选择题(十一)操作系统与嵌入式

1、紧耦合多机系统一般通过&#xff08;共享内存&#xff09;实现多机间的通信。对称多处理器结构&#xff08;SMP&#xff09;属于&#xff08; 紧耦合&#xff09;系统。 松耦合多机系统又称间接耦合系统,—般是通过通道或通信线路实现计算机间的互连。 2、采用微内核的OS结构…

VM虚假机联网(无代码,超简单)NAT模式

1、左边顶上编辑里面最下面找到虚拟网络编辑器2.启用管理员特权3.重新创建一个NAT模式的网络&#xff08;名称随便一个&#xff09; 4.打开这两个设置里面的东西进行拍照并记住IP区间和网关&#xff0c;等下要用&#xff1b; 5.打开虚拟机&#xff0c;右上角&#xff0c;下标点…

操作系统实战(三)(linux+C语言实现)

实验目的 加深对进程调度概念的理解&#xff0c;体验进程调度机制的功能&#xff0c;了解Linux系统中进程调度策略的使用方法。 练习进程调度算法的编程和调试技术。 实验说明 1.在linux系统中调度策略分为3种 SCHED_OTHER&#xff1a;默认的分时调度策略&#xff0c;值为0…

Keycloak实战+spring boot

标题 前言项目搭建前言 最近项目中使用keycloak,为了更好的上手,我先本地Windows搭建一套demo 项目搭建 我本地jdk版本号为: 通过网上查询一些资料查看,jdk1.8对应的keycloak版本为:15的版本,但是没有找到,我只能下载如下: 通过码云我找到了具体的版本号,开始下…

国内注册Claude 3流程

国内注册Claude 3流程 Claude 3是什么注册过程准备国外IP节点准备谷歌账号或者邮箱准备接码平台接码平台WildCard输入验证码继续注册 使用聊天功能识图功能文件解析编码能力 Cloud 3 已经推出两个月了&#xff0c;当时可是轰动一时&#xff0c;但是其并不对国内开放&#xff0c…

Go 语言并发编程初体验:简洁高效

文章目录 前言GoLang 并发编程基本概念进程与线程线程和协程并行与并发GoLang的协程机制 GoLang 并发实践案例需求传统方式实现使用 goroutines 实现并发goroutine 如何通信channel 使用注意事项 总结 前言 Go语言是谷歌推出的一种的编程语言&#xff0c;可以在不损失应用程序…