题解:(其实我也没太读懂这所谓"普及组"的题目,那就先这样模拟吧)
这道题实际上是利用了立体几何的透视原理
我们可以从后面往前画
这是一种非常奇怪的方法
但是却非常有效
我们可以先写一个函数
画一个立方体
void deal(int x,int y){ for(int i=y+1;i<y+4;i++) p[x][i]=p[x-3][i]=p[x-5][i+2]='-'; for(int i=x-1;i>x-3;i--) p[i][y]=p[i][y+4]=p[i-2][y+6]='|'; for(int i=x-1;i>x-3;i--) for(int j=y+1;j<y+4;j++) p[i][j]=' '; for(int i=x-2;i>x-4;i--) p[i][y+5]=' '; for(int i=y+2;i<y+5;i++) p[x-4][i]=' '; p[x][y]=p[x-3][y]=p[x][y+4]=p[x-3][y+4]='+'; p[x-4][y+1]=p[x-4][y+5]=p[x-1][y+5]='/'; p[x-5][y+2]=p[x-5][y+6]=p[x-2][y+6]='+'; }
其实这一步是十分好想的
自己画图就能想出来
接下来是计算长度和宽度
经过我个人运算
w=4*n+2*m+1; for(int i=1;i<=m;i++) for(int j=1;j<=n;j++) h=max(h,H[i][j]*3+3+2*(m-i));
AC代码:
#include<cstdio> #include<cstring> #include<iostream> using namespace std; #define N 51 int n,m,w,h,H[N][N]; char p[N*20][N*20]; inline void deal(int x,int y){ for(int i=y+1;i<y+4;i++) p[x][i]=p[x-3][i]=p[x-5][i+2]='-'; for(int i=x-1;i>x-3;i--) p[i][y]=p[i][y+4]=p[i-2][y+6]='|'; for(int i=x-1;i>x-3;i--) for(int j=y+1;j<y+4;j++) p[i][j]=' '; for(int i=x-2;i>x-4;i--) p[i][y+5]=' '; for(int i=y+2;i<y+5;i++) p[x-4][i]=' '; p[x][y]=p[x-3][y]=p[x][y+4]=p[x-3][y+4]='+'; p[x-4][y+1]=p[x-4][y+5]=p[x-1][y+5]='/'; p[x-5][y+2]=p[x-5][y+6]=p[x-2][y+6]='+'; } int main(){ cin>>m>>n; for(int i=1;i<=m;i++) for(int j=1;j<=n;j++) cin>>H[i][j]; w=4*n+2*m+1; for(int i=1;i<=m;i++) for(int j=1;j<=n;j++) h=max(h,H[i][j]*3+3+2*(m-i)); for(int i=1;i<=h;i++) for(int j=1;j<=w;j++) p[i][j]='.'; for(int i=1;i<=m;i++) for(int j=1;j<=n;j++) for(int k=1;k<=H[i][j];k++) deal(h-2*(m-i)-3*(k-1),4*(j-1)+1+(m-i)*2); for(int i=1;i<=h;i++){ for(int j=1;j<=w;j++) cout<<p[i][j]; cout<<endl; } return 0; }