目录

题目

题解


题目

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

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

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

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

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

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

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

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

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

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

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

输入格式

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

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

输出格式

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

数据范围

1≤m,n≤50

输入样例:

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

输出样例:

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

题解:

知识点:字符串处理、模拟、坐标变换

分析:

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

char box[6][8] = {"..+---+","./   /|","+---+ |","|   | +","|   |/.","+---+.."
};

然后为了正确处理遮挡关系,按照从后到前、从左到右、从下到上的顺序画每个小正方体即可。

两个坐标系如下所示,我们将最靠左、前、下的小立方体,和二维坐标系中左下角的点(499,0)对齐。

然后观察可以发现二者的映射关系:设小立方体在 (x,y,z)( ,即第 x 行第 y 列第 z 层, 则对于投影后的坐标而言:

  • 横坐标:z 每变1,横坐标变3,x 每变1,横坐标变2;
  • 纵坐标:x 每变1,总坐标变2,y 每变1,纵坐标变4

因此投影之后的左下角坐标是:

  • 横坐标是 499−3z−2(n−1−x)
  • 纵坐标是 2(n−1−x)+4y

接下来还需要确定投影之后的二维平面的范围。

最后将二维投影平面的范围内的部分输出即可。

这题好造孽

代码:

#include<iostream>
#include<cstdio>
#include<algorithm>
#define _for(i,a,b) for (int i=(a);i<(b);i++)
using namespace std;
const int N=500;
int h[N][N];
char g[N][N],box[6][8]={//预处理,注意是box[6][8],不是box[6][7],因为每个字符串末还有占位符"..+---+","./   /|","+---+ |","|   | +","|   |/.","+---+.."
};
int main(){int n,m,up=N,right=0;scanf("%d%d",&n,&m);_for(i,0,n){_for(j,0,m){scanf("%d",&h[i][j]);}}_for(i,0,N){//预处理_for(j,0,N){g[i][j]='.';}}_for(x,0,n){_for(y,0,m){_for(z,0,h[x][y]){int X=499-3*z-((n-1-x)<<1),Y=4*y+((n-1-x)<<1);//见解析(<<1是*2的意思)up=min(up,X-5);//整个二维立方体上边界right=max(right,Y+6);//右边界_for(a,0,6){//填充单位二维立方体_for(b,0,7){if (box[a][b]!='.'){g[X-5+a][Y+b]=box[a][b];//自己画图理解}}}}}}_for(i,up,N){//输出_for(j,0,right+1){putchar(g[i][j]);}puts("");}return 0;
}

C++题解:[NOIP2008pj]立体图相关推荐

  1. 【洛谷p1058】立体图(已完结)

    立体图[题目链接] 然后因为有点(不是有点,非常)懵,因此我只能看一步写一步. 首先总体思路: 将三维立体图看做二维平面图,先确定出二维图的长和宽,然后,按照三维立体图的透视顺序,从最后一排的最左开始 ...

  2. [JS][dfs]题解 | #迷宫问题#

    题解 | #迷宫问题# 题目链接 迷宫问题 题目描述 定义一个二维数组 N*M ,如 5 × 5 数组下所示: int maze[5][5] = { 0, 1, 0, 0, 0, 0, 1, 1, 1 ...

  3. [JS][dp]题解 | #打家劫舍(一)#

    题解 | #打家劫舍(一)# 题目链接 打家劫舍(一) 题目描述 描述 你是一个经验丰富的小偷,准备偷沿街的一排房间,每个房间都存有一定的现金,为了防止被发现,你不能偷相邻的两家,即,如果偷了第一家, ...

  4. [JS]题解 | #魔法数字#

    题解 | #魔法数字# 题目链接 魔法数字 题目描述 牛妹给牛牛写了一个数字n,然后又给自己写了一个数字m,她希望牛牛能执行最少的操作将他的数字转化成自己的. 操作共有三种,如下: 在当前数字的基础上 ...

  5. [JS]题解 | #岛屿数量#

    题解 | #岛屿数量# 题目链接 岛屿数量 题目描述 时间限制:1秒 空间限制:256M 描述 给一个01矩阵,1代表是陆地,0代表海洋, 如果两个1相邻,那么这两个1属于同一个岛.我们只考虑上下左右 ...

  6. [JS] 题解:提取不重复的整数

    题解:提取不重复的整数 https://www.nowcoder.com/practice/253986e66d114d378ae8de2e6c4577c1 时间限制:1秒 空间限制:32M 描述 输 ...

  7. 洛谷-题解 P2672 【推销员】

    独门思路!链表加优先队列! 这题一望,贪心是跑不掉了,但是我贪心并不好,所以想到了一个复杂一些但思路更保稳的做法 思路: 1 因为是离线操作,所以我们可以倒着求,先求x=n的情况,因为那样直接就知道了 ...

  8. [洛谷1383]高级打字机 题解

    题解 这道题一看就珂以用主席树啊 这是一道神奇的题目,那么我们先敲一个主席树,然后维护一个数组len,表示下一次应该在len + 1插入, 之后对于T操作,在上一个版本的len + 1上直接执行插入 ...

  9. luogu P1549 棋盘问题(2) 题解

    luogu P1549 棋盘问题(2) 题解 题目描述 在\(N * N\)的棋盘上\((1≤N≤10)\),填入\(1,2,-,N^2\)共\(N^2\)个数,使得任意两个相邻的数之和为素数. 例如 ...

最新文章

  1. mysql最小费用最大流问题_算法笔记_140:最小费用最大流问题(Java)
  2. Compiler__visual_studio_2010_pro 激活码
  3. Exynos1080处理器性能与功耗究竟怎么样?
  4. 利用Vert.x构建简单的API 服务、分布式服务
  5. rails 开发随手记 9
  6. ipython notebook使用教程
  7. Linux宝库名人轶事栏目 | 我与中国开源软件二十年(一)
  8. Modbus调试软件使用教程
  9. jpg格式怎么转换成plt格式的_一种JPG图像到PLT文件的转化方法.pdf
  10. WordPress整站轻松开启HTTPS 1
  11. 漏洞补丁:windwos补丁下载(MS17-010)
  12. hausaufgabe--python 22- Recurse
  13. wps怎么把当前页面设置为横向_wps单页面方向设置为横向的方法
  14. 浮点数开方运算的快速计算
  15. java-net-php-python-java作业批改系统的设计PPT计算机毕业设计程序
  16. 解决viewUI中 DatePicker控件获取的日期总是少一天的问题
  17. 针对MacBook提示目前翻译不可用请稍后再试的解决方法
  18. python-matplotlib-箱线图为不同的箱体设置不同颜色
  19. python计算学分绩点_使用Python计算研究生学分绩(绩点)
  20. Spring Boot第八篇-关于web静态资源的整合

热门文章

  1. 三天打鱼两天晒网的c语言程序,回归经典之C语言《三天打鱼两天晒网》
  2. Linux下部署kettle
  3. CSGO服务器租用如何选择合适的配置?CSGO服务器怎么选择?
  4. 华为研发加班160个小时意味这什么
  5. Android Studio SQLite 数据库 增删改查 简单
  6. 相位通俗解释_必读:通俗地解释一下印度占星是什么?
  7. 零基础学小程序 —— 模板样式(三)
  8. smart200plc
  9. 基于PHP+MSQL的在线邮箱管理系统的设计与实现【开题报告、源码】
  10. [HAProxy] CentOS7安装HAProxy1.8.17后启动报错“cannot bind UNIX socket [/var/lib/haproxy/stats]”解决