首页 > 其他 > 详细

luogu P1058 立方体

时间:2017-02-02 19:55:02      阅读:210      评论:0      收藏:0      [点我收藏+]

做了这个题后明确了自己的定位。。。

恩。。。普及-

 

 

题目大意估计都知道。。

给个传送门:   luogu

 

做了半上午 + 一整个下午的题。。。
占了我今天到的绝大多数时间。
其实此题不难, 核心代码我很快就写了出来
但是我做的方法非常神奇
出了一个非常隐秘的问题,导致我浪费了很多时间在查错上面


思路:
核心代码就是构建一个立方体
我的立方体是从右上角开始构建的
由分析可知:只要从一开始的地方挨个放置,就可以覆盖后面的
所以不必考虑重叠或谁在前谁在后的问题
我是枚举的每个立方体图形的右下角
然后在构建的过程中记录上下左右四个方位所延展的最大位置即可

但是我的做法有个最不同的地方是:
我是随便找了个地方作为起始点的,因为靠近边界的话会数组越界。。
所以直接近似于随机一个点。。

 

 

#include <iostream>
#include <cstdio>
#define Max 5009
#define INF 1e7
using namespace std;
char map[Max][Max];
int number[Max / 60][Max / 60];
inline int max (int a, int b)
{
    return a > b ? a : b;
}
inline int min (int a, int b)
{
    return a < b ? a : b;
}
inline void read (int &now)
{
    now = 0;
    char word = getchar ();
    while (word < 0 || word > 9)
        word = getchar ();
    while (word >= 0 && word <= 9)
    {
        now = now * 10 + (int)(word - 0);
        word = getchar ();
    }
}
void Put (int x, int y)  //以下为构建一个立方体 
{
    map[x][y] = map[x][y - 4] = +;
    for (int i = 1; i <= 3; i++)
        map[x][y - i] = -;
    map[++x][--y] = map[x][y - 4] = /;
    map[x][y + 1] = |;
    for (int i = 1; i <= 3; i++)
        map[x][y - i] =  ;
    map[++x][--y] = map[x][y - 4] = +;
    map[x][y + 2] = |;
    for (int i = 1; i <= 3; i++)
        map[x][y - i] = -;
    map[x][y + 1] =  ;
    map[++x][y] = map[x][y - 4] = |;
    map[x][y + 2] = +;
    for (int i = 1; i <= 3; i++)
        map[x][y - i] =  ;
    map[x][y + 1] =  ;
    map[++x][y] = map[x][y - 4] = |;
    map[x][y + 1] = /;
    for (int i = 1; i <= 3; i++)
        map[x][y - i] =  ;
    map[++x][y] = map[x][y - 4] = +;
    for (int i = 1; i <= 3; i++)
        map[x][y - i] = -;
}
int main (int argc, char *argv[])
{
    int N;
    int M;
    read (N);
    read (M);
    int k;
    int X = N * 30;
    int Y = M * 30;
    int x = X, y = Y + 4;
    int up = INF, L = INF;
    int down = -INF, R = -INF;
    for (int i = 1; i <= N; i++)
    {
        for (int j = 1; j <= M; j++)
        {
            read (k);
            x = X;
            y = Y + j * 4;
            down = max (down, x); //  注意!!! 记录下界要放在操作的上面,我的时间都浪费在了这上面 
            while (k--)
            {
                Put (x - 4, y + 6);
                x -= 3;  //  每个格子的立方体由下不断往上放 
            }
            R = max (R, y); // 记录其他边界 
            up = min (up, x);
            L = min (L, y);
        }
        X += 2;
        Y -= 2;
    }
    for (int i = up - 1; i <= down + 1; i++)
    {
        for (int j = L; j <= R + 6; j++)
            if (map[i][j] == | || map[i][j] == / || map[i][j] == + || map[i][j] == - || map[i][j] ==  )
                printf ("%c", map[i][j]);
            else    
                printf (".");
        printf ("\n");
    }
    return 0;
}

 

luogu P1058 立方体

原文:http://www.cnblogs.com/ZlycerQan/p/6361518.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!