传送

样例:

输出样例:

(洛谷上面的那个太丑了就不放了)

大佬博客在此

乍一看好像真的没有什么思路

所以我们结合ybr大佬的代码进行分析

疑点都将在代码下面进行分析(面对代码做题模式开始)

  1. #include<cstdio>
  2. #include<iostream>
  3. using namespace std;
  4. int read(){
  5. int ans=;
  6. char last=' ',ch=getchar();
  7. while(ch<''||ch>'')
  8. last=ch,ch=getchar();
  9. while(ch>=''&&ch<='')
  10. {
  11. ans=(ans<<)+(ans<<)+(ch^);
  12. ch=getchar();
  13. }
  14. return last=='-'?-ans:ans;
  15. }
  16. char c[][],c1[][]=
  17. {//倒着存储
  18. "+---+",
  19. "| |/",
  20. "| | +",
  21. "+---+ |",
  22. " / /|",
  23. " +---+",
  24. };//6行7列 的方块
  25. int n,m,jz[][],maxh=-,maxl=-,zbx,zby;
  26. inline void fg(int zbx,int zby)//覆盖操作
  27. {
  28. for(int i=;i<=;i++)c[zbx][zby+i]=c1[][i];//这里是逐行覆盖
  29. for(int i=;i<=;i++)c[zbx+][zby+i]=c1[][i];
  30. for(int i=;i<=;i++)c[zbx+][zby+i]=c1[][i];
  31. for(int i=;i<=;i++)c[zbx+][zby+i]=c1[][i];
  32. for(int i=;i<=;i++)c[zbx+][zby+i]=c1[][i];//为什么从1开始?因为考虑到不在立方体内的空格要变成"."
  33. for(int i=;i<=;i++)c[zbx+][zby+i]=c1[][i];//从2开始同上
  34. }
  35. int main()
  36. {
  37. m=read();n=read();
  38. for(int i=;i<=m;i++)
  39. {
  40. for(int j=;j<=n;j++)
  41. {
  42. jz[i][j]=read();
  43. }
  44. }
  45. for(int i=;i<=m;i++)//从输入的矩阵的左上角开始,满足先后,先左
  46. for(int j=;j<=n;j++)
  47. {
  48. zbx=(m-i)*+;zby=(m-i)*++*(j-);//待会解释
  49. for(int k=;k<=jz[i][j];k++,zbx+=)
  50. {
  51. fg(zbx,zby);
  52. }
  53. if(zbx+>maxh)maxh=zbx+;//我不知道为什么 (by ybr)(下面有解释)
  54. if(zby+>maxl)maxl=zby+;
  55. }
  56. for(int i=maxh;i>=;i--)//上面计算zbx是默认原点是(1,1),不是(0,0)
  57. {
  58. for(int j=;j<=maxl;j++)
  59. {
  60. if(c[i][j]=='\0') printf(".");//如果c[i][j]没有被覆盖过,就输出"."
  61. else
  62. printf("%c",c[i][j]);
  63. }
  64. printf("\n");
  65. }
  66. return ;
  67. }

难点:1:zbx,zby是个啥玩意?

(zbx,zby)枚举当前的这个块的左下角在输出的图中的坐标

就是枚举这个蓝点辣

注意我们把最终输出的立体图当做二维图来看

推导:

zbx:(我们先考虑只有一层的情况)

我们注意到,一个字符在上面的x轴上的贡献是1,(x轴就是上面说的x轴)

m-i:

(不要在意没有画完的最右边)

从上图看出来,m-i就是m和i隔着几“行”,其中,一“行”在x轴上的贡献是2,所以要(m-i)*2,因为一个块的边对x的贡献都是2,我们要先+2,再-2,就抵消了。

又因为下标是从1开始计算,所以要+1

每往上摞一层,zbx就要+3(一层对x轴的贡献是3)

zby:

我们拿那个蓝色的方块举例。

因为一个方块在y轴方向上的贡献是4(这里的贡献不会重复计算),所以不考虑"."的贡献,当前的zby是(j-1)*4+1

再通过肉眼观察,发现在输出图中,是"+"的那一行最左边的"."的数量都是偶数,“.”对y轴的贡献是(m-i)*2

难点2:maxh?maxl?为毛这俩的更新方法如此玄学?

ybr:我也不知道为什么

咳咳我们来研究一下这个玄学的问题

窝盟先来分析一下zby+6是个什么鬼

分析如下:

一张手动补全的图

我们看到,在第一行的方块左下角在y轴上的坐标+6就是最终输出图的最右端

zbx+2:

由于代码在执行取maxh,maxl之前有以下神奇的操作

  1. for(int k=;k<=jz[i][j];k++,zbx+=3)
  2. {
  3. fg(zbx,zby);
  4. }

这就是看每一个格子上面有几个方块

在执行完神奇的操作之后,原本表示左下角的zbx变成了左上角(可以手画一下)

由于一个在x轴上的贡献是2,所以是zbx+2

难点3:这是什么存储方法怎么好像是倒着的?

它的确是倒着的

难点4:这是什么个覆盖顺序???

从后往前枚举(i是从1到m,因为第1行在最里面),从左往右枚举,从下往上枚举

好了解释完了qwq(逃

P1058立体图(面对代码解释)的更多相关文章

  1. Deep Learning入门视频(下)之关于《感受神经网络》两节中的代码解释

    代码1如下: #深度学习入门课程之感受神经网络(上)代码解释: import numpy as np import matplotlib.pyplot as plt #matplotlib是一个库,p ...

  2. [ARM] Cortex-M Startup.s启动文件相关代码解释

    1. 定义一个段名为CSTACK, 这里: NOROOT表示如何定义的段没有被关联,那么同意会被优化掉,如果不想被优化掉就使用ROOT. 后面的括号里数字表示如下: (1):这个段是2的1次方即2字节 ...

  3. word2vec代码解释

    以前看的国外的一篇文章,用代码解释word2vec训练过程,觉得写的不错,转过来了 原文链接 http://nbviewer.jupyter.org/github/dolaameng/tutorial ...

  4. 通过代码解释什么是API,什么是SDK?

    这个问题说来惭愧,读书时找实习面的第一家公司,问的第一个问题就是这个. 当时我没能说清楚,回去之后就上百度查.结果查了很久还是看不懂,然后就把这个问题搁置了. 谁知道毕业正式工作后,又再一次地面对了这 ...

  5. javascript代码解释执行过程

    javascript是由浏览器解释执行的脚本语言,不同于java c,需要先编译后运行,javascript 由浏览器js解释器进行解释执行,总的过程分为两大块,预编译期和执行期 下面的几个demo解 ...

  6. 临时2级页表的初始化过程 head_32.S 相关代码解释

    page_pde_offset = (__PAGE_OFFSET >> 20); /* __PAGE_OFFSET是0xc0000000,page_pde_offset = 3072 = ...

  7. 零基础学python之入门和列表数据(附详细的代码解释和执行结果截图)

    Python学习笔记 1 快速入门 下载安装好Python之后,在开始找到 双击打开一个窗口,这是一个shell界面编辑窗口,点击左上角的file——new file新建一个窗口,这里可以输入完整的代 ...

  8. java 的一个hellow word 代码解释

    /* This is a simple Java program. Call this file "Example.java". */(上面是注释的方法) class Exampl ...

  9. TensorFlow的序列模型代码解释(RNN、LSTM)---笔记(16)

    1.学习单步的RNN:RNNCell.BasicRNNCell.BasicLSTMCell.LSTMCell.GRUCell (1)RNNCell 如果要学习TensorFlow中的RNN,第一站应该 ...

随机推荐

  1. [Python3] 016 字典:给我一块硬盘,我可以写尽天下!

    目录 0 字典的独白 1 字典的创建 2 字典的特性 3 字典的常见操作 (1) 数据的访问.更改与删除 (2) 成员检测 (3) 遍历 4 字典生成式 5 字典的内置方法 6 可供字典使用的其它方法 ...

  2. 数组去重,排序,重复次数,两个数组合并,两个数组去重,map(),filter(),reduce()

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...

  3. python小感悟(初学者)

    计算机语言的起源: 在计算机刚发明出来的时候,是一大堆的机械硬件,然后技术人员开发了操作系统,操作系统是最底层的软件,负责与硬件沟通,执行其他软件的命令.由于计算机只能识别0和1两种特殊的机器语言,所 ...

  4. 什么是python??

    python 是一门非常简单易学好用,同时功能强大的编程语言,具有丰富和强大的库,开发效率特别高.它常被昵称为胶水语言,能够把用其他语言制作的各种模块(尤其是C/C++)很轻松地联结在一起. pyth ...

  5. EOJ Monthly 2019.2 A. 回收卫星

    题目传送门 题意: 你可以询问一个三维坐标,机器会告诉你这个坐标在不在目标圆中, 并且(0,0,0)是一定在圆上的,叫你求出圆心坐标 思路: 因为(0,0,0)一定在圆上,所以我们可以把圆心分成3个坐 ...

  6. MVC框架与MTC框架

    3.WEB框架 MVC Model View Controller 数据库 模板文件 业务处理 MTV Model Template View 数据库 模板文件 业务处理 ############## ...

  7. jenkins使用记录转自https://my.oschina.net/sanpeterguo/blog/197931

    摘要: jenkins(持续集成开源工具)提供了丰富的api接口,基本上所有的操作都可以使用curl来从后台调度,包括:创建项目,禁用项目,启用项目,获取项目描述,获取配置文件,普通触发,scm触发, ...

  8. [Vue warn]: You may have an infinite update loop in a component render function

    [Vue warn]: You may have an infinite update loop in a component render function 这个问题很奇怪,之前从来没有遇到过.如果 ...

  9. Scrapy抓取jobbole数据

    1.python版本3.6.1 2.python编辑器:JetBrains PyCharm 2.安装virtualenvwrapper-win pip3 install virtualenvwrapp ...

  10. 日志处理--高效Linux命令整理

    序 在学习使用python处理日志开始阶段,对我阻力最大的莫过于对linux的不熟悉了,有种寸步难行的感觉. 在之后乱学一通之后,发现有点对我颇有益处: 学<鸟哥linux私房菜基础学习篇> ...