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; }
myj 吊打我Orz,xxy 捆起来打我Orz,myl 文化课上天Orz, lrh 姿势水平敲高Orz, hkd 特别胖Orz%%%,cys 智商感人Orz,syl zz专业Orz,我没有学上, 我们未来一片光明