zoukankan      html  css  js  c++  java
  • 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 ("
    ");
        }
        return 0;
    }
  • 相关阅读:
    110、抽象基类为什么不能创建对象?
    109、什么情况会自动生成默认构造函数?
    108、如果想将某个类用作基类,为什么该类必须定义而非声明?
    107、类如何实现只能静态分配和只能动态分配
    106、C++中的指针参数传递和引用参数传递有什么区别?底层原理你知道吗?
    hdoj--2036--改革春风吹满地(数学几何)
    nyoj--46--最少乘法次数(数学+技巧)
    vijos--P1211--生日日数(纯模拟)
    nyoj--42--一笔画问题(并查集)
    nyoj--49--开心的小明(背包)
  • 原文地址:https://www.cnblogs.com/ZlycerQan/p/6361518.html
Copyright © 2011-2022 走看看