AcWing 436. 立体图

news/2024/11/22 21:28:10/

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

小渊有一块面积为 m×n 的矩形区域,上面有 m×n 个边长为 1 的格子,每个格子上堆了一些同样大小的积木(积木的长宽高都是 1),小渊想请你打印出这些格子的立体图。

我们定义每个积木为如下格式,并且不会做任何翻转旋转,只会严格以这一种形式摆放:

每个顶点用 1 个加号 + 表示,长用 3 个  表示,宽用 1 个 / 表示,高用两个 | 表示。

字符 +,,/,| 的 ASCII 码分别为 43,45,47,124。

字符 . (ASCII 码 46)需要作为背景输出,即立体图里的空白部分需要用 . 来代替。

立体图的画法如下面的规则:

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

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

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

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

输入格式

输入文件第一行有用空格隔开的两个整数 m  和 n ,表示有 m×n个格子。 

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

输出格式

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

数据范围

1≤m,n≤50

输出样例:

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

思路  字符串处理,模拟

 将一个小正方体的投影画出来:

char box[6][8] = {
    "..+---+",
    "./   /|",
    "+---+ |",
    "|   | +",
    "|   |/.",
    "+---+.."
};
然后为了正确处理遮挡关系,按照从后到前、从左到右、从下到上的顺序画每个小正方体即可。

#include <iostream>
#include <algorithm>using namespace std;const int N = 500;int n, m;
char box[6][8] = {"..+---+","./   /|","+---+ |","|   | +","|   |/.","+---+.."
};char g[N][N];
int h[N][N];int main()
{scanf("%d%d", &n, &m);for (int i = 0; i < n; i++)for (int j = 0; j < m; j++)scanf("%d", &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 - 2 * (n - 1 - x) - 3 * z;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++) printf("%c", g[i][j]);puts("");}
} 

http://www.ppmy.cn/news/271345.html

相关文章

#423

第一次参加CF比赛T^T真是惊险刺激啊&#xff01;大佬太多了&#xff01;&#xff01;&#xff01;膜拜大佬&#xff01; A. Restaurant Tables time limit per test 1 second memory limit per test 256 megabytes input standard input output standard output In a small res…

Day435436.支付系统 -谷粒商城

支付系统 一、基本概念 1、加密 ①对称加密 什么是对称加密 所谓对称加密&#xff0c;就是发送方要给接收方在网络上发送一段明文&#xff0c;但是不能直接发。 发送方需要加密&#xff0c;对称加密指的就是加密和解密用的是同一把密钥。 假设发送方准备了一串明文&#…

LeetCode-436. 寻找右区间【双指针】

题目描述&#xff1a; 给你一个区间数组 intervals &#xff0c;其中 intervals[i] [starti, endi] &#xff0c;且每个 starti 都 不同 。 区间 i 的 右侧区间 可以记作区间 j &#xff0c;并满足 startj > endi &#xff0c;且 startj 最小化 。 返回一个由每个区间 i…

439

1&#xff0e;政治   具体来说&#xff0c;政治共有六门课程需要复习&#xff0c;工作量大&#xff0c;任务较重。从历年考研试卷出题的情况看&#xff0c;六门课程在试卷中所占比重并不平均&#xff0c;所以我认为要根据各门课程的不同特点合理安排复习时间。 首先&#xf…

436分复试被刷!山东大学软件学院

山东大学是一所985大学&#xff0c;位于山东省省会济南市&#xff0c;计算机学科评估B&#xff0c;软件工程学科评估B&#xff0c;在985大学中排名中游&#xff0c;水平还不错。 今天来聊一下&#xff0c;山东大学软件学院的情况。 首先是2021考研的招生目录&#xff1a; 图片来…

【博客436】kubeadm init原理

kubeadm init原理 在k8s master中&#xff0c;会先启动一个kubelet&#xff0c;控制面组件通过kubelet static pod特性启动 初始化一个工作流执行如下阶段工作&#xff1a; 也可以使用 kubeadm init phase 分阶段执行 // cmd/kubeadm/app/cmd/init.go-NewCmdInit()...// initi…

LeetCode 436. 寻找右区间(二分查找)

1. 题目 给定一组区间&#xff0c;对于每一个区间 i&#xff0c;检查是否存在一个区间 j&#xff0c;它的起始点大于或等于区间 i 的终点&#xff0c;这可以称为 j 在 i 的“右侧”。 对于任何区间&#xff0c;你需要存储的满足条件的区间 j 的最小索引&#xff0c;这意味着区…