luogu P1058 立体图
生活随笔
收集整理的這篇文章主要介紹了
luogu P1058 立体图
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
做了這個題后明確了自己的定位。。。
恩。。。普及-
?
?
題目大意估計都知道。。
給個傳送門: ? luogu
?
做了半上午 + 一整個下午的題。。。
占了我今天到的絕大多數(shù)時間。
其實此題不難, 核心代碼我很快就寫了出來
但是我做的方法非常神奇
出了一個非常隱秘的問題,導致我浪費了很多時間在查錯上面
思路:
核心代碼就是構建一個立方體
我的立方體是從右上角開始構建的
由分析可知:只要從一開始的地方挨個放置,就可以覆蓋后面的
所以不必考慮重疊或誰在前誰在后的問題
我是枚舉的每個立方體圖形的右下角
然后在構建的過程中記錄上下左右四個方位所延展的最大位置即可
但是我的做法有個最不同的地方是:
我是隨便找了個地方作為起始點的,因為靠近邊界的話會數(shù)組越界。。
所以直接近似于隨機一個點。。
?
?
#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; }?
轉載于:https://www.cnblogs.com/ZlycerQan/p/6361518.html
總結
以上是生活随笔為你收集整理的luogu P1058 立体图的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。