c++题目_[NOIP2008 普及组] 立体图

2024-08-28 17:52

本文主要是介绍c++题目_[NOIP2008 普及组] 立体图,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

# [NOIP2008 普及组] 立体图

## 题目描述

小渊是个聪明的孩子,他经常会给周围的小朋友们讲些自己认为有趣的内容。最近,他准备给小朋友们讲解立体图,请你帮他画出立体图。

小渊有一块面积为 $m \times n$ 的矩形区域,上面有 $m \times n$ 个边长为 $1$ 的格子,每个格子上堆了一些同样大小的积木(积木的长宽高都是 $1$),小渊想请你打印出这些格子的立体图。我们定义每个积木为如下格式,并且不会做任何翻转旋转,只会严格以这一种形式摆放:

$$
\def\arraystretch{1e-10}
\begin{aligned}
&\verb!  +---+!\\
&\verb! /   /|!\\
&\verb!+---+ |!\quad\textsf{高}\\
&\verb!|   | +!\\
&\verb!|   |/ !\quad\textsf{宽}\\
&\verb!+---+  !\\
& \quad\textsf{长}
\end{aligned}$$


每个顶点用 $1$ 个加号 `+` 表示,长用 $3$ 个 `-` 表示,宽用 $1$ 个 `/`,高用两个 `|` 表示。字符 `+`,`-`,`/`,`|` 的 ASCII 码分别为 $43$,$45$,$47$,$124$。字符 `.`(ASCII 码 $46$)需要作为背景输出,即立体图里的空白部分需要用 `.` 来代替。立体图的画法如下面的规则:

若两块积木左右相邻,图示为:


$$
\def\arraystretch{1e-10}
\begin{aligned}
\verb!..+---+---+!\\
\verb!./   /   /|!\\
\verb!+---+---+ |!\\
\verb!|   |   | +!\\
\verb!|   |   |/.!\\
\verb!+---+---+..!\\
\end{aligned}
$$

若两块积木上下相邻,图示为:


$$
\def\arraystretch{1e-10}
\begin{aligned}
\verb!..+---+!\\
\verb!./   /|!\\
\verb!+---+ |!\\
\verb!|   | +!\\
\verb!|   |/|!\\
\verb!+---+ |!\\
\verb!|   | +!\\
\verb!|   |/.!\\
\verb!+---+..!\\
\end{aligned}
$$

若两块积木前后相邻,图示为:

$$
\def\arraystretch{1e-10}
\begin{aligned}
\verb!....+---+!\\
\verb!.../   /|!\\
\verb!..+---+ |!\\
\verb!./   /| +!\\
\verb!+---+ |/.!\\
\verb!|   | +..!\\
\verb!|   |/...!\\
\verb!+---+....!\\
\end{aligned}
$$

立体图中,定义位于第 $(m,1)$ 的格子(即第 $m$ 行第 $1$ 列的格子)上面自底向上的第一块积木(即最下面的一块积木)的左下角顶点为整张图最左下角的点。

## 输入格式

第一行有用空格隔开的$2$个整数 $m$ 和 $n$,表示有 $m \times n$ 个格子 $(1 \le m,n \le 50)$。

接下来的 $m$ 行,是一个 $m \times n$ 的矩阵,每行有 $n$ 个用空格隔开的整数,其中第 $i$ 行第 $j$ 列上的整数表示第 $i$ 行第 $j$ 列的格子上摞有多少个积木($1 \le $ 每个格子上的积木数 $ \le 100$)。

## 输出格式

输出包含题目要求的立体图,是一个 $K$ 行 $L$ 列的字符串矩阵,其中 $K$ 和 $L$ 表示最少需要 $K$ 行 $L$ 列才能按规定输出立体图。

## 样例 #1

### 样例输入 #1

```
3 4
2 2 1 2
2 2 1 1
3 2 1 2
```

### 样例输出 #1

```
......+---+---+...+---+
..+---+  /   /|../   /|
./   /|-+---+ |.+---+ |
+---+ |/   /| +-|   | +
|   | +---+ |/+---+ |/|
|   |/   /| +/   /|-+ |
+---+---+ |/+---+ |/| +
|   |   | +-|   | + |/.
|   |   |/  |   |/| +..
+---+---+---+---+ |/...
|   |   |   |   | +....
|   |   |   |   |/.....
+---+---+---+---+......
```

## 提示

NOIP2008普及组第四题

这段代码的作用是根据输入的高度信息,绘制一个立体感的箱子的图形。代码中使用了输入的高度信息来确定每个箱子的立体感展示,然后使用字符数组来绘制箱子的图形。

这段代码的输入包括两个整数 n 和 m,分别表示箱子的行数和列数。然后是一个 n 行 m 列的二维数组,表示每个位置的高度。根据高度信息,使用字符数组来绘制立体感的箱子图形。

这段代码使用了一些固定的数组大小,包括了一个 500x500 的高度数组和一个 500x500 的字符数组。然后根据输入的高度信息,绘制了立体感的箱子图形,并输出到标准输出中。

这段代码的功能是比较复杂的,包括了数组操作、字符绘制等。

代码:

#include<bits/stdc++.h>
using namespace std;
const int N=500;
int h[N][N];
char g[N][N];
int n,m;
char box[6][8]=
{"..+---+","./   /|","+---+ |","|   | +","|   |/.","+---+..",
};int main()
{cin>>n>>m;for(int i=0;i<n;i++){for(int j=0;j<m;j++){cin>>h[i][j];	} } 	for(int i=0;i<N;i++){for(int j=0;j<N;j++){g[i][j]='.';}}int up=N,right=0;for(int x=0;x<n;x++){for(int y=0;y<m;y++){for(int z=0;z<h[x][y];z++){int X=499-3*z-2*(n-1-x);int Y=2*(n-1-x)+4*y;up=min(up,X-5);right=max(right,Y+6);for(int a=0;a<6;a++){for(int b=0;b<7;b++){if(box[a][b]!='.'){g[X-5+a][Y+b]=box[a][b];}}}}}}for(int i=up;i<N;i++){for(int j=0;j<=right;j++){cout<<g[i][j];}cout<<endl;}return 0;
} 

这篇关于c++题目_[NOIP2008 普及组] 立体图的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1115473

相关文章

C++ 中的 if-constexpr语法和作用

《C++中的if-constexpr语法和作用》if-constexpr语法是C++17引入的新语法特性,也被称为常量if表达式或静态if(staticif),:本文主要介绍C++中的if-c... 目录1 if-constexpr 语法1.1 基本语法1.2 扩展说明1.2.1 条件表达式1.2.2 fa

C++中::SHCreateDirectoryEx函数使用方法

《C++中::SHCreateDirectoryEx函数使用方法》::SHCreateDirectoryEx用于创建多级目录,类似于mkdir-p命令,本文主要介绍了C++中::SHCreateDir... 目录1. 函数原型与依赖项2. 基本使用示例示例 1:创建单层目录示例 2:创建多级目录3. 关键注

C++从序列容器中删除元素的四种方法

《C++从序列容器中删除元素的四种方法》删除元素的方法在序列容器和关联容器之间是非常不同的,在序列容器中,vector和string是最常用的,但这里也会介绍deque和list以供全面了解,尽管在一... 目录一、简介二、移除给定位置的元素三、移除与某个值相等的元素3.1、序列容器vector、deque

C++常见容器获取头元素的方法大全

《C++常见容器获取头元素的方法大全》在C++编程中,容器是存储和管理数据集合的重要工具,不同的容器提供了不同的接口来访问和操作其中的元素,获取容器的头元素(即第一个元素)是常见的操作之一,本文将详细... 目录一、std::vector二、std::list三、std::deque四、std::forwa

C++字符串提取和分割的多种方法

《C++字符串提取和分割的多种方法》在C++编程中,字符串处理是一个常见的任务,尤其是在需要从字符串中提取特定数据时,本文将详细探讨如何使用C++标准库中的工具来提取和分割字符串,并分析不同方法的适用... 目录1. 字符串提取的基本方法1.1 使用 std::istringstream 和 >> 操作符示

C++原地删除有序数组重复项的N种方法

《C++原地删除有序数组重复项的N种方法》给定一个排序数组,你需要在原地删除重复出现的元素,使得每个元素只出现一次,返回移除后数组的新长度,不要使用额外的数组空间,你必须在原地修改输入数组并在使用O(... 目录一、问题二、问题分析三、算法实现四、问题变体:最多保留两次五、分析和代码实现5.1、问题分析5.

C++ 各种map特点对比分析

《C++各种map特点对比分析》文章比较了C++中不同类型的map(如std::map,std::unordered_map,std::multimap,std::unordered_multima... 目录特点比较C++ 示例代码 ​​​​​​代码解释特点比较1. std::map底层实现:基于红黑

C++中函数模板与类模板的简单使用及区别介绍

《C++中函数模板与类模板的简单使用及区别介绍》这篇文章介绍了C++中的模板机制,包括函数模板和类模板的概念、语法和实际应用,函数模板通过类型参数实现泛型操作,而类模板允许创建可处理多种数据类型的类,... 目录一、函数模板定义语法真实示例二、类模板三、关键区别四、注意事项 ‌在C++中,模板是实现泛型编程

利用Python和C++解析gltf文件的示例详解

《利用Python和C++解析gltf文件的示例详解》gltf,全称是GLTransmissionFormat,是一种开放的3D文件格式,Python和C++是两个非常强大的工具,下面我们就来看看如何... 目录什么是gltf文件选择语言的原因安装必要的库解析gltf文件的步骤1. 读取gltf文件2. 提

C++快速排序超详细讲解

《C++快速排序超详细讲解》快速排序是一种高效的排序算法,通过分治法将数组划分为两部分,递归排序,直到整个数组有序,通过代码解析和示例,详细解释了快速排序的工作原理和实现过程,需要的朋友可以参考下... 目录一、快速排序原理二、快速排序标准代码三、代码解析四、使用while循环的快速排序1.代码代码1.由快