立体图【模拟】

很有新意的题目,很久以前就看到了,可是一直没做,因为实在是麻烦......

唯一一点需要注意的是画图的顺序,因为所画的图是从前、 从右的角度观察的,所以为了满足近处遮挡远处、右处遮挡左处的效果,应该按照从后到前,从左到右的顺序,因为后打印的会覆盖前打印的。

刚开始时我以为样例给错了 后来才发现原来是因为前面遮挡后面,而后面的整个边才占一个像素点 ,整条边被遮挡后就导致了奇怪的样子 由此告诉我们膏轻午马的优越性.........


代码如下:

#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;
	
	
}




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值