luogu P1058 立体图

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

恩。。。普及-

 

 

题目大意估计都知道。。

给个传送门:   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;
}

 

posted @ 2017-02-02 19:44  ZlycerQan  阅读(222)  评论(0编辑  收藏  举报