【洛谷p1058】立体图

时间:2019-07-05
本文章向大家介绍【洛谷p1058】立体图,主要包括【洛谷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