P1058 立体图

斯德哥尔摩

2018-10-21 08:42:12

Personal

[P1058 立体图](https://www.luogu.org/problemnew/show/P1058) 真·超级大模拟。。。 先把图形存在数组中,然后从后往前,从下往上,从左往右依次覆盖。 重点是要找到每个立方体输出的位置,看程序中那个$update$函数就好。 至于每个立方体怎么搞。。。打个表就好了嘛。。。 附代码: ```cpp #include<iostream> #include<algorithm> #include<cstdio> #define MAXN 60 #define MAXM 1010 using namespace std; const char cube[10][10]={ " +---+", " / /|", "+---+ |", "| | +", "| |/", "+---+" }; const int begin[6]={2,1,0,0,0,0}; const int end[6]={6,6,6,6,5,4}; int n,m,maxx=0,maxy=0; int val[MAXN][MAXN]; char ans[MAXM][MAXM]; inline int read(){ int date=0,w=1;char c=0; while(c<'0'||c>'9'){if(c=='-')w=-1;c=getchar();} while(c>='0'&&c<='9'){date=date*10+c-'0';c=getchar();} return date*w; } void update(int x,int y){ for(int i=5;i>=0;i--) for(int j=begin[i];j<=end[i];j++){ ans[5-i+x][j+y]=cube[i][j]; maxx=max(maxx,5-i+x); maxy=max(maxy,j+y); } } void work(){ for(int i=1;i<=n;i++) for(int j=1;j<=m;j++) for(int k=1;k<=val[i][j];k++) update((n-i)*2+1+3*(k-1),(n-i)*2+1+4*(j-1)); for(int i=maxx;i>=1;i--){ for(int j=1;j<=maxy;j++){ if(ans[i][j]==0)printf("."); else printf("%c",ans[i][j]); } printf("\n"); } } void init(){ n=read();m=read(); for(int i=1;i<=n;i++) for(int j=1;j<=m;j++) val[i][j]=read(); } int main(){ init(); work(); return 0; } ```