P1058 立体图
斯德哥尔摩
2018-10-21 08:42:12
[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;
}
```