【洛谷p1058】立体图
然后因为有点(不是有点,非常)懵,因此我只能看一步写一步。
首先总体思路:
将三维立体图看做二维平面图,先确定出二维图的长和宽,然后,按照三维立体图的透视顺序,从最后一排的最左开始依次覆盖操作,直到覆盖完成,不用的地方填‘.’;
首先是处理二维图的长和宽:
经过画图找规律我们了解到了对于一个方块,如果我们在它上面增加一个方块,对于这个方块和新增的方块的某个对应点来说,长增加了3,宽增加0;:
对应点用不同颜色标出;
然后对于前后摆放的情况:
从图中可以看出,长增加了2,宽增加了2;
然后对于左右摆放的情况:
由图中可以看出,长莫得增加,宽增加了4;
然后对应以下数组:
//宽的增加量 int dm[4]={0,0,4,2};//1竖着摞,2横着摞,3前后摞 //长的增加量 int dn[4]={0,3,0,2};//1竖着摞,2横着摞,3前后摞
然后我们求一下我们要存的二维平面的大小:
对于横放的宽:从最左下角开始计算,先计算
中,最右下的位置(图中红圈内紫色点的位置);
=(m-1)*dm[2]+5(首先第一个方块占了5个单位,然后剩余的m-1个方块,每放一个,增加4个单位)
计算完成后,再计算
中剩余位置也就是红圈‘+’所在位置,如何计算剩下的长度呢,我们需要用到前后摆放的增加量:还是同样,首先先把第一个方块单列,这个方块的(右面吧)为宽提供了3的价值,剩余n-1个方块,每个为宽提供了2个价值。
因此宽mm=5+(m-1)*dm[2]+(n-1)*dm[3];
再来看长,因为lz看的题解的博主:小蒟蒻皮皮鱼(友情提示,这是个大佬)他自己说他比较菜,用的枚举的方法,lz也只看懂了枚举的方法:
for(int i=1;i<=n;i++) for(int j=1;j<=m;j++) nn=max(nn,atlas[i][j]*dn[1]+dn[3]*(n-i+1)+1); //枚举每一个点的长,取最大值
同样算最高的,先算出:atlas[i][j]*dn[1]+1(其中atlas为输入的矩阵数据),算出的是粉线部分,然后(n-i+1)这个表示的是第几排(因为数组是:↓→这样存储的,但是实际上我们要画的是↑→的图,因此要减一下)对于第(n-i+1)排,它的上面对长的贡献就是dn[3]*(n-i+1)(这里不再加一是因为有一个点前面和上面都有贡献,我们只需要加一次(绿点处)),也就是每个方块对长贡献2;(当然要枚举取最高的)
然后考虑一张图,我们按照透视的顺序,从后往前,从左往右的依次添加覆盖,首先是最左下的立方体(其实一般会被全部覆盖掉,但我们还是要加),然后我们固定一个点,为立方体的定位点,以此点为基础拓展出整个立方体,所以最关键的一点就是定位立方体了:
原文地址:https://www.cnblogs.com/zhuier-xquan/p/11135044.html
- 强大的API测试工具Hitchhiker v0.9 基于UI的断言测试,回顾2017
- WEB前端架构(二)
- WEB前端架构(三)
- node.js基本工作原理及流程
- Github+Jekyll搭建个人博文网站
- Ecmascript语法之Symbol
- 区块链的java实现
- gitlab操作指南
- 如何构建智能反垃圾邮件WordPress插件
- 在Mac上搭建React Native开发环境
- Universal-Image-Loader,android-Volley,Picasso、Fresco和Glide图片缓存库的联系与区别
- React Native之StyleSheet样式表
- 高仿ios斗鱼界面
- 浅谈前端JavaScript编程风格
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 通过Rxjava看Kotlin协程(一)
- Fuzz中的javascript大小写特性
- 通过RxJava看kotlin协程(二)
- Android 黑科技 |Gradle Plugin使用场景
- php5全版本绕过open_basedir读文件脚本
- CameraX 封装二维码扫描组件
- Kotlin拓展函数的真身
- 一个一年没解决的ClassNotFoundException|类加载机制探索
- 我有个大胆的方案可以提高ARouter和WMRouter的编译速度
- Tornado模板对空白字符的处理与解决方案
- View的有效曝光监控(上)|RecyclerView 篇
- PHP绕过open_basedir列目录的研究
- View的有效曝光监控(下)|ScrollView NestScrollView篇
- 聊聊AbstractProcessor和Java编译流程
- Okhttp如何开启的Http2.0