一道大模拟

思路:

首先是打表找规律时间

仔细思考(暴力手算)后推出这么一个数组:

//宽的增加量
int dm[]={,,,};//1竖着摞,2横着摞,3前后摞
//长的增加量
int dn[]={,,,};//1竖着摞,2横着摞,3前后摞

这是什么意思呢?在初始的情况下,一个正方体的长是7个字符(对应了二维图的宽,就是y),高是6个字符(对应了二维图的长,就是x)

如图,橙色表示二维图的参数,黑色表示三维正方体的参数

我们用1表示竖着摞,2表示横着摞,3表示前后摞

我们发现

  • 每竖着摞一个正方体,二维图的宽是不会变的,但是长会在6的基础上+3
  • 每横着摞一个正方体,二维图的宽在7的基础上增加4,长不变
  • 每前后摞一个正方体,二维图的长和宽都在原来的基础上增加2

我们既然要输出最后的图,显然要先求出他的长和宽

宽是比较好求的,因为宽只与横着摞和前后摞有关,而这两个方式都可以直接又输入的n和m得出。设mm为输出图的宽,则:

  mm=7+(n-1)*dm[3]+(m-1)*dm[2];

而长就不一样了,长不但与前后摞有关,还与上下摞有关,因为我没有ybr神仙那么强,所以我决定枚举。

    for(int i=;i<=n;i++)
{
for(int j=;j<=m;j++)
{
nn=max(nn,atlas[i][j]*dn[]+dn[]*(n-i+)+);
//枚举每一个点的长,取最大值
}
}

于是我们就求出了长和宽,接下来考虑处理图。可以用一个点来代表整张图,这里我选择左下角的点,可以根据当前的位置(给的矩阵的某个位置)推出左下角的点,然后进行覆盖就好了。由于是按照从后向前,从左到右的顺序进行处理的,所以后来的会把先来的覆盖上,就处理了透视的问题

完整代码:

#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<string>
#include<algorithm>
#include<cmath>
#include<queue>
using namespace std; inline int read()
{
int ans=;
char last=' ',ch=getchar();
while(ch<''||ch>'') last=ch,ch=getchar();
while(ch>=''&&ch<='') ans=ans*+ch-'',ch=getchar();
if(last=='-') ans=-ans;
return ans;
} int n,m; char s1[][]=
{
"..+---+",
"./ /|",
"+---+ |",
"| | +",
"| |/.",
"+---+.."
};
//宽的增加量
int dm[]={,,,};//1竖着摞,2横着摞,3前后摞
//长的增加量
int dn[]={,,,};//1竖着摞,2横着摞,3前后摞 char s[][]; int atlas[][]; int mm,nn; inline void zhetizhenduliu(int i,int j,int x,int y)
{
int a,b;
while(atlas[i][j]--)
{
for(a=;a<;a++)
for(b=;b<;b++)
if(s1[-a-][b]!='.')
s[x-a][y+b]=s1[-a-][b];
x-=;
} } int main()
{
//freopen("drawing.in","r",stdin);
//freopen("drawing.out","w",stdout);
n=read(),m=read(); for(int i=;i<=;i++)
{
for(int j=;j<=;j++)
{
s[i][j]='.';
}
} for(int i=;i<=n;i++)
{
for(int j=;j<=m;j++)
{
atlas[i][j]=read();
}
} if(m==&&n==&&atlas[][]==)
{
printf("..+---+\n./ /|\n+---+ |\n| | +\n| |/.\n+---+..\n");
return ;
} mm=+(n-)*dm[]+(m-)*dm[];//求出输出的宽
for(int i=;i<=n;i++)
{
for(int j=;j<=m;j++)
{
nn=max(nn,atlas[i][j]*dn[]+dn[]*(n-i+)+);
//枚举每一个点的长,取最大值
}
} for(int i=;i<=n;i++)
{
for(int j=,x,y;j<=m;j++)
{
x=nn-dn[]*(n-i);//考虑倒着搞,i前面的会产生2*(n-i)的影响
y=dm[]*(n-i)+dm[]*(j-)+;
zhetizhenduliu(i,j,x,y);
}
}
for(int i=;i<=nn;i++)
{
for(int j=;j<=mm;j++)
{
printf("%c",s[i][j]);
}
puts("");
} }

PS:由于我太蒟了,考试的时候想到了做法但是覆盖的地方写炸,所以后来借鉴了题解(竟然和我思路差不多)

P1058立体图的更多相关文章

  1. P1058 立体图题解

    小渊是个聪明的孩子,他经常会给周围的小朋友们将写自己认为有趣的内容.最近,他准备给小朋友们讲解立体图,请你帮他画出立体图. 小渊有一块面积为m \times nm×n的矩形区域,上面有m \times ...

  2. P1058立体图(面对代码解释)

    传送 样例: 输出样例: (洛谷上面的那个太丑了就不放了) 大佬博客在此 乍一看好像真的没有什么思路 所以我们结合ybr大佬的代码进行分析 疑点都将在代码下面进行分析(面对代码做题模式开始) #inc ...

  3. luogu P1058 立体图

    做了这个题后明确了自己的定位... 恩...普及- 题目大意估计都知道.. 给个传送门:   luogu 做了半上午 + 一整个下午的题... 占了我今天到的绝大多数时间. 其实此题不难, 核心代码我 ...

  4. P1058 立体图

    链接:Miku ------------------------------ 蒟蒻在线%lmk,ljx,lpy,yyq大佬们 ------------------------------ Good N ...

  5. NOIP 2008 立体图

    洛谷 P1058 立体图 洛谷传送门 JDOJ 1541: [NOIP2008]立体图 T4 JDOJ传送门 题目描述 小渊是个聪明的孩子,他经常会给周围的小朋友们将写自己认为有趣的内容.最近,他准备 ...

  6. 模拟画图题P1185 绘制二叉树

      题目链接P1185 绘制二叉树 题意概述   根据规则绘制一棵被删去部分节点的满二叉树.节点用 \(o\) 表示,树枝用/\表示.每一层树枝长度会变化,以满足叶子结点有如下特定: 相邻叶子节点是兄 ...

  7. 2019.7.12 sdfzoier做题统计

    lixf_lixf :9 P1981 表达式求值 P1076 寻宝 P1199 三国游戏 P1308 统计单词数 P1190 接水问题 P1158 导弹拦截 P1070 道路游戏 P1069 细胞分裂 ...

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

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

  9. Matlab 绘制三维立体图(以地质异常体为例)

    前言:在地球物理勘探,流体空间分布等多种场景中,定位空间点P(x,y,x)的物理属性值Q,并绘制三维空间分布图,对我们洞察空间场景有十分重要的意义. 1. 三维立体图的基本要件: 全空间网格化 网格节 ...

随机推荐

  1. Eclipse删除已安装插件

    环境:(Windows) Eclipse 1.点击菜单"Help",选择"Install New Software",在弹出的对话框中选择"alrea ...

  2. Java中的四种权限修饰符

    权限修饰符   public protected [default] private 同一个类 YES YES YES YES 同一个包 YES YES YES NO 不同包子类 YES YES NO ...

  3. 计算机系统结构总结_Multiprocessor & cache coherence

    Textbook:<计算机组成与设计——硬件/软件接口>  HI<计算机体系结构——量化研究方法>          QR 最后一节来看看如何实现parallelism 在多处 ...

  4. java-webservice的简单实现

    服务端: 1.创建正常j2ee项目,创建service接口 package service; import javax.jws.WebMethod; import javax.jws.WebServi ...

  5. Response笔记

    # 今日内容          1. HTTP协议:响应消息     2. Response对象     3. ServletContext对象 ## HTTP协议:     1. 请求消息:客户端发 ...

  6. 九、LaTex中的浮动体

    未利用浮动体:

  7. CSS的优先级理解

    样式的优先级 多重样式(Multiple Styles):如果外部样式.内部样式和内联样式同时应用于同一个元素,就是使多重样式的情况. 一般情况下,优先级如下: (外部样式)External styl ...

  8. [编译原理]用BDD方式开发lisp解释器(编译器)|开发语言java|Groovy|Spock

    lisp是一门简单又强大的语言,其语法极其简单: (+ 1 2 ) 上面的意思 是:+是方法或函数,1 ,2 是参数,fn=1+2,即对1,2进行相加求值,结果是:3 双括号用来提醒解释器开始和结束. ...

  9. AngularJS中forEach的用法

    AngularJS中当我们需要遍历某个数组的时候,我们会用到forEach语法.AngularJS中forEach的用法如下: angular.forEach(array,function(obj,i ...

  10. 怎么在html动态实现显示和隐藏效果

    效果目标图: 这个还是比较好实现的,附源码: <!DOCTYPE html> <html> <head> <meta charset="utf-8& ...