很有新意的题目,很久以前就看到了,可是一直没做,因为实在是麻烦......
唯一一点需要注意的是画图的顺序,因为所画的图是从前、 从右的角度观察的,所以为了满足近处遮挡远处、右处遮挡左处的效果,应该按照从后到前,从左到右的顺序,因为后打印的会覆盖前打印的。
刚开始时我以为样例给错了 后来才发现原来是因为前面遮挡后面,而后面的整个边才占一个像素点 ,整条边被遮挡后就导致了奇怪的样子 由此告诉我们膏轻午马的优越性.........
代码如下:
#include <cstdio>
char pic[1000][1000];
int k[1000][1000],m,n,max=0;
void fill(int x,int y)
{
for(int i=x-1;i>=x-2;i--)
for(int j=y+1;j<=y+3;j++)
pic[i][j]=' ';
pic[x-4][y+2]=pic[x-4][y+3]=pic[x-4][y+4]=' ';
pic[x-3][y+5]=pic[x-2][y+5]=' ';
pic[x][y]=43;
pic[x-2][y]=pic[x-1][y]=124;
pic[x-3][y]=43;
pic[x][y+1]=pic[x][y+2]=pic[x][y+3]=45;
pic[x-3][y+1]=pic[x-3][y+2]=pic[x-3][y+3]=45;
pic[x][y+4]=43;
pic[x-1][y+4]=pic[x-2][y+4]=124;
pic[x-3][y+4]=43;
pic[x-4][y+5]=47;
pic[x-4][y+1]=47;
pic[x-5][y+2]=43;
pic[x-5][y+3]=pic[x-5][y+4]=pic[x-5][y+5]=45;
pic[x-5][y+6]=43;
pic[x-3][y+6]=pic[x-4][y+6]=124;
pic[x-2][y+6]=43;
pic[x-1][y+5]=47;
}
void draw(int i,int j,int k)
{
int x=max-(2*i-1+3*(k-1))+1;
int y=4*j-3+2*(i-1);
fill(x,y);
}
void show()
{
for(int i=1;i<=max;i++)
{
for(int j=1;j<=4*n+1+2*m;j++)
printf("%c",pic[i][j]);
printf("\n");
}
}
int main()
{
scanf("%d%d",&m,&n);
for(int i=m;i>=1;i--)
for(int j=1;j<=n;j++)
{
scanf("%d",&k[i][j]);
if((k[i][j]*3+2*i+1)>max)
max=k[i][j]*3+2*i+1;
}
// printf("\n%d %d\n",max,4*n+1+2*m);
for(int i=1;i<=max;i++)
for(int j=1;j<=4*n+1+2*m;j++)
pic[i][j]=46;
for(int i=m;i>=1;i--)
for(int j=1;j<=n;j++)
{
// printf("\ni=%d j=%d\n",i,j);
for(int l=1;l<=k[i][j];l++)
draw(i,j,l);
// show();
}
for(int i=1;i<=max;i++)
{
for(int j=1;j<=4*n+1+2*m;j++)
printf("%c",pic[i][j]);
printf("\n");
}
return 0;
}