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;
    }
  • 相关阅读:
    什么是webview
    juqery.fn.extend和jquery.extend
    LeetCode
    5. Longest Palindromic Substring
    42. Trapping Rain Water
    11. Container With Most Water
    621. Task Scheduler
    49. Group Anagrams
    739. Daily Temperatures
    3. Longest Substring Without Repeating Characters
  • 原文地址:https://www.cnblogs.com/ZlycerQan/p/6361518.html
Copyright © 2011-2022 走看看