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://www.mzph.cn/web/9807.shtml

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

相关文章

tengine-docker镜像制作

1.下载 wget https://tengine.taobao.org/download/tengine-3.0.0.tar.gz 或者直接下载这个包括下边两个配置文件了 https://download.csdn.net/download/cyw8998/89286114 2.编辑nginx.conf文件 #####user nobody; worker_processes 1;#error_log logs/error.log; #er…

浅析扩散模型与图像生成【应用篇】(二十三)——Imagic

23. Imagic: Text-Based Real Image Editing with Diffusion Models 该文提出一种基于文本的真实图像编辑方法&#xff0c;能够根据纯文本提示&#xff0c;实现复杂的图像编辑任务&#xff0c;如改变一个或多个物体的位姿和组成&#xff0c;并且保持其他特征不变。相比于其他文…

c语言题库之序列合并

文章目录 前言C语言题目&#xff1a;分析1. 合并逻辑2.图解合并逻辑 代码实现注意事项总结思考 前言 在编程中&#xff0c;我们经常遇到需要将两个有序序列合并为一个有序序列的问题。下面&#xff0c;我们就来详细探讨一下如何解决这个问题&#xff0c;包括输入处理、合并逻辑…

python 根据网址和关键词批量下载影像

最近用到了GLASS的LAI产品&#xff0c;但这个产品的文件夹分得很细&#xff0c;我需要的影像又有8个瓦片&#xff0c;一个一个点击很麻烦&#xff0c;于是探索了批量下载的方法 一、下载1幅 import requests import re import os import requests import re# 网页URLurl &…

深入理解Java HashSet类及其实现原理

哈喽&#xff0c;各位小伙伴们&#xff0c;你们好呀&#xff0c;我是喵手。运营社区&#xff1a;C站/掘金/腾讯云&#xff1b;欢迎大家常来逛逛 今天我要给大家分享一些自己日常学习到的一些知识点&#xff0c;并以文字的形式跟大家一起交流&#xff0c;互相学习&#xff0c;一…

Java中什么是多态?多态的实现原理是什么?多态在Java中的意思实现方式是什么?多态在框架设计中有什么作用应用场景?

什么是多态&#xff1f; 多态是面向对象编程中的一个重要概念&#xff0c;它允许不同类的对象对同一消息做出响应。在 Java中&#xff0c;多态通常体现为子类对象可以替代父类对象的特性。这意味着你可以使用父类的引用来引用子类的对象。 多态的实现原理&#xff1a; 多态的…

如何在 CentOS 上安装并配置 Redis

如何在 CentOS 上安装并配置 Redis 但是太阳&#xff0c;他每时每刻都是夕阳也都是旭日。当他熄灭着走下山去收尽苍凉残照之际&#xff0c;正是他在另一面燃烧着爬上山巅散烈烈朝晖之时。 ——史铁生 环境准备 本教程将在 CentOS 7 或 CentOS 8 上进行。确保你的系统已更新到最…

Channel实现Flutter与原生平台之间的双向通信

文章目录 &#xff08;一&#xff09;通过MessageChannel实现Flutter与原生平台之间的双向通信Flutter端实现MessageChannel通信步骤&#xff1a;Android端实现MessageChannel通信步骤&#xff1a; &#xff08;二&#xff09;通过MethodChannel实现Flutter与原生平台之间的双向…

uniapp/微信小程序实现加入购物车点击添加飞到购物车动画

1、预期效果 2、实现思路 每次点击添加按钮时&#xff0c;往该按钮上方添加一个悬浮元素&#xff0c;通过位移动画将元素移到目标位置。 1. 为每个点击元素设置不同的class&#xff0c;才能通过uni.createSelectorQuery来获取每个元素的节点信息&#xff1b; 2. 添加一个与…

c++:(map和set的底层简单版本,红黑树和AVL树的基础) 二叉搜索树(BST)底层和模拟实现

文章目录 二叉搜索树的概念二叉搜索树的操作二叉搜索树的查找find 二叉搜索树的模拟实现构造节点insertfinderase(细节巨多,面试可能会考)a.叶子节点b.有一个孩子左孩子右孩子 c.有两个孩子注意: erase代码 中序遍历 二叉搜索树的应用k模型k模型模拟实现的总代码 k-value模型k-…

7-Zip命令行调用命令收集(20个)

列出压缩文件的内容: 7z l archive.7z 解压压缩文件到当前目录: 7z x archive.7z 解压压缩文件到指定目录: 7z x archive.7z -o"C:\path\to\extract" 创建新的压缩文件 (添加到archive.7z): 7z a archive.7z file_to_compress 创建包含多个文件的压缩文件: 7z a arc…

【JVM】了解JVM规范中的虚拟机结构

目录 JVM规范的主要内容 1&#xff09;字节码指令集(相当于中央处理器CPU) JVM指令分类 2&#xff09;Class文件的格式 3&#xff09;数据类型和值 4&#xff09;运行时数据区 5&#xff09;栈帧 6&#xff09;特殊方法 7&#xff09;类库 JVM规范的主要内容 1&#…

Vue3+ElementPlus+TS开发业务功能的问题汇总(持续更新)

1.开发表单弹框功能时遇到两个问题&#xff1a;加入了校验规则后&#xff0c;无论下拉框是否选择数据下面的红色提示都会触发显示不会自动隐藏 &#xff1b; 另外&#xff0c;新增的功能在提交后数据无法重置&#xff0c;这种在修改时可能会出现&#xff0c;但新增正常情况是不…

走进C++:C到C++的过渡

目录 什么是C呢&#xff1f; C的发展史 多了一些吃前来很香的“语法糖”。 语法糖一&#xff1a;命名空间 命名空间有个强大的功能 如何使用 语法糖二&#xff1a;缺省参数 语法糖三&#xff1a;函数重载 语法糖四&#xff1a;引用 引用传参 引用返回 引用和…

【ZZULIOJ】1100: 求组合数(函数专题)(Java)

目录 题目描述 输入 输出 样例输入 Copy 样例输出 Copy 提示 code 题目描述 马上要举办新生程序设计竞赛了&#xff0c;与以往不同的是&#xff0c;本次比赛以班为单位&#xff0c;为了全面衡量一个班级的整体水平&#xff0c;要求从一个班的m位同学中任选k位同学代表本…

Android GPU渲染SurfaceFlinger合成RenderThread的dequeueBuffer/queueBuffer与fence机制(2)

Android GPU渲染SurfaceFlinger合成RenderThread的dequeueBuffer/queueBuffer与fence机制&#xff08;2&#xff09; 计算fps帧率 用 adb shell dumpsys SurfaceFlinger --list 查询当前的SurfaceView&#xff0c;然后有好多行&#xff0c;再把要查询的行内容完整的传给 ad…

算法训练Day35 | ● 343. 整数拆分 ● 96.不同的二叉搜索树

343. 整数拆分 class Solution { public:int integerBreak(int n) {vector<int> dp(n1, 0);dp[2] 1;for(int i3; i<n1; i){for(int j 1; j<i/2; j){dp[i] max(dp[i], max(j*(i-j), j*dp[i-j]));}}return dp[n];} };参考文章&#xff1a;代码随想录-343. 整数拆分…

找不到msvcp140.dll无法执行代码的原因分析及修复方法

当用户在尝试运行某些应用程序或游戏时&#xff0c;可能会遇到系统弹出错误提示&#xff0c;显示“找不到msvcp140.dll无法执行代码”这一错误信息&#xff0c;它会导致程序无法正常启动。为了解决这个问题&#xff0c;我经过多次尝试和总结&#xff0c;找到了以下五种解决方法…

hadoop启动后没有namenode,datanode等解决方法

之前用的是虚拟机&#xff0c;在虚拟机上安装的hadoop&#xff0c;但是后来&#xff0c;电脑恢复出厂设置了&#xff0c;什么都重新开始。就在本地安装 Linux 子系统。 但是&#xff0c;有时候start-dfs.sh后&#xff0c;jps出现错误。 像这种拒绝连接 解决办法就是如下&…

我的创作纪念日1460天(4年)

机缘 作为一名技术爱好者&#xff0c;我最初成为创作者的初心源于对知识的渴望和对分享的热情。在参与多个实战项目的过程中&#xff0c;我积累了丰富的经验&#xff0c;这些经验不仅仅是代码和解决方案&#xff0c;更多的是对问题本质的理解和解决问题的思维方式。我意识到&a…