一道大模拟

思路:

首先是打表找规律时间

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

//宽的增加量
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. 腾讯云从零搭建PHP运行环境

    一.首先我们得注册腾讯云,租用一台服务器,我选择的是CentOS 7.2 64位,这时候会给你这台主机的公网IP和内网IP,以及这台主机的用户名及密码. 二.我们可以使用腾讯云网页上自带的登录按钮进行 ...

  2. mysql5.7单机多实例安装

    基于之前的mysql5.7单实例安装 修改/etc/my.cnf文件如下(这里配置4个实例,可自行修改数目) # # 多实例配置文件,可以mysqld_multi --example 查看例子 # [ ...

  3. org.apache.httpcomponents:httpclient 工具类

    基于httpclient 版本4.4.1 因为http连接需要三次握手,在需要频繁调用时浪费资源和时间 故采用连接池的方式连接 根据实际需要更改  连接池最大连接数.路由最大连接数 另一个需要注意的是 ...

  4. 排列perm HYSBZ - 1072(状压dp/暴力)

    Description 给一个数字串s和正整数d, 统计s有多少种不同的排列能被d整除(可以有前导0).例如123434有90种排列能被2整除,其中末位为2的有30种,末位为4的有60种. Input ...

  5. R语言parse函数与eval函数的字符串转命令行及执行操作

    parse()函数能将字符串转换为表达式expression:eval()函数能对表达式求解 A <- : B <- 'print(A)' class(B) C <- parse(t ...

  6. Spring基础17——使用注解来配置Bean

    1.组件扫描 组件扫描(component scanning):Spring能够从classpath下自动扫描,侦测和实例化具有特定的注解的组件. 特定组件包括: —@Component:基本注解,标 ...

  7. Linux--shell函数--08

    1.函数介绍 为了避免代码的重复使用,我们一般通过函数编写代码块,而这一个代码块用来实现某种功能:且这个功能在后面的代码中会重复使用. 2.函数的语法格式: [ function ] 函数名 [ ( ...

  8. Mongo--04 Mongo分片集群

    目录 一.分片的概念 二. 分片工作原理 三.IP端口目录规划 1.IP端口规划 2.目录规划 四.分片集群搭建副本集步骤 1.安装软件 2.创建目录 3.创建配置文件 4.优化警告 5.启动服务 6 ...

  9. C#设置欢迎窗体由不透明变透明

    public Form1()        {            InitializeComponent();        } private bool isForm1 = true;  //设 ...

  10. Java Annotation 刷课笔记(二)

    1.反射机制性能问题(安全检查) 1.1setAccessible 启用和禁用访问安全检查的开关,值为true,则指示反射的对象在使用时应该取消Java语言访问检查,值为false,则指示反射的对象应 ...