洛谷 P1058 立体图

来源:互联网 发布:板式家具软件 编辑:程序博客网 时间:2024/05/16 11:12

炒鸡好玩的一道题。

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

于是就纯模拟。


#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代码。

0 0