洛谷 P1058 立体图

炒鸡好玩的一道题。

主要就是先画后面的,再画前面的,这样前面的方块就会把后面的覆盖掉。

于是就纯模拟。


#include<iostream>  
#include<cstring>  
using namespace std;  
char a[301][301];  
int n,m,b[51][51],high=300,len;//用high len分别储存长度和高度  
void built(int x,int y)//模拟打出一个小方块,本函数可以忽略(就是疯狂赋值)  
{  
    int i;  
    for(i=y+1; i<=y+3; i++)  
    {  
        a[x][i]='-';  
        a[x-1][i]=' ';  
        a[x-2][i]=' ';  
        a[x-3][i]='-';  
    }  
    for(i=x-1; i>=x-2; i--)  
    {  
        a[i][y]='|';  
        a[i][y+4]='|';  
    }  
    a[x][y]='+';  
    a[x][y+4]='+';  
    a[x-3][y]='+';  
    a[x-3][y+4]='+';  
    a[x-1][y+5]='/';  
    a[x-4][y+5]='/';  
    a[x-2][y+5]=' ';  
    a[x-2][y+6]='+';  
    a[x-3][y+5]=' ';  
    a[x-3][y+6]='|';  
    a[x-4][y+1]='/';  
    for(i=y+2; i<=y+4; i++)  
      a[x-4][i]=' ';  
    a[x-4][y+6]='|';  
    a[x-5][y+2]='+';  
    for(i=y+3; i<=y+5; i++)  
      a[x-5][i]='-';  
    a[x-5][y+6]='+';  
    if(x-5<high) high=x-5;  
    if(y+6>len) len=y+6;  
}  
void read()  
{  
    int i,j,k,x,y;    
    memset(a,'.',sizeof(a));//背景  
    cin>>m>>n;  
    for(i=1; i<=m; i++)  
      for(j=1; j<=n; j++)  
        cin>>b[i][j];  
    x=300; y=1;//从最左下角开始打  
/*思想是这样的:先打最后面的,从左往右打,前面的覆盖后面的,右面的覆盖左面的*/  
    for(i=2; i<=m; i++)  
    {  
        x-=2;  
        y+=2;  
    }  
    for(i=1; i<=m; i++)  
    {  
        int x1=x,y1=y;  
        for(j=1; j<=n; j++)  
        {  
              for(k=1; k<=b[i][j]; k++)  
              {  
                  built(x1,y1);  
                  x1-=3;  
            }  
              x1=x; y1+=4;  
        }  
        x+=2; y-=2;  
    }  
    for(i=high; i<=300; i++)//从高度上  
    {  
        for(j=1; j<=len; j++)//从长度上  
          cout<<a[i][j];  
        cout<<endl;  
    }  
    return;  
}  
int main()  
{  
    read();  
    return 0;  
}  


AC代码。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值