记录编号 331791 评测结果 AAAAAAAAAA
题目名称 [NOIP 2008]立体图 最终得分 100
用户昵称 GravatarRapiz 是否通过 通过
代码语言 C++ 运行时间 0.019 s
提交时间 2016-10-28 00:46:28 内存使用 1.25 MiB
显示代码纯文本
#include<cstdio>
#include<cstring>
#define file(x) "drawingu."#x
int n,m,k,l;
char buf[1000][1000];
inline void hline(int x,int y,int l){
	for(int i=y;i<=y+l;i++) buf[x][i]=(buf[x][i]=='.'||buf[x][i]==' ')?'-':'+';
}
inline void vline(int x,int y,int l){
	for(int i=x;i<=x+l;i++) buf[i][y]=(buf[i][y]=='.'||buf[i][y]==' ')?'|':'+';
}
inline void cvline(int x,int y,int l){
	for(int i=x;i<=x+l;i++) buf[i][y]=' ';
}
inline void sline(int x,int y,int l){
	for(int i=x,j=y;i<=x+l;i++,j++) buf[i][j]=(buf[i][j]=='.'||buf[i][j]==' ')?'/':'+';
}
void tshow(){
	for(int i=k;i;i--,printf("\n")) for(int j=1;j<=l;j++) printf("%c",buf[i][j]);
	printf("\n");
}
void draw(int x,int y,int h){
	x=1+(x-1<<1),y=x+(y-1<<2);
	for(int i=x;i<=x+3*h;i++) for(int j=y;j<=y+4;j++) buf[i][j]=' ';//front
	for(int i=x+3*h;i<=x+3*h+2;i++) {
		int s=y+i-(x+3*h);
		for(int j=s;j<=s+4;j++) buf[i][j]=' ';
	}//top
	for(int i=y+4;i<=y+4+2;i++){
		cvline(x+(i-(y+4)),i,3*h);
	}
	for(int i=0;i<=h;i++) hline(x+i*3,y,4),sline(x+i*3,y+4,2);
	hline(x+h*3+2,y+2,4),sline(x+3*h,y,2);
	vline(x,y,h*3),vline(x,y+4,h*3),vline(x+2,y+4+2,h*3);
}
int main(){
	freopen(file(in),"r",stdin);
	freopen(file(out),"w",stdout);
	scanf("%d%d",&n,&m);
	memset(buf,'.',sizeof(buf));
	for(int i=1;i<=n;i++) for(int j=1;j<=m;j++) {
		int h;scanf("%d",&h);
		draw(n-i+1,j,h);
	}
	bool f;
	do{
		f=0;
		for(int i=1;i<1000;i++) if(buf[k+1][i]!='.') {
			f=1;
			++k;
			break;
		}
	}while(f);
	do{
		f=0;
		for(int i=1;i<=k;i++) if(buf[i][l+1]!='.') {
			f=1;
			++l;
			break;
		}
	}while(f);
	tshow();
}