题解 P1058 【立体图】

· · 题解


#include <cstdio>

using namespace std;
/*

  +---+
 /   /|
+---+ |
|   | +
|   |/
+---+

*/
char map[1000][1000]; 
int num[1000][1000],mark[1000][1000],n,m,k,l;
bool flag;
void fix(int x,int y){
    for(int i=x-1;i>=x-2;--i)
     for(int j=y+1;j<=y+3;++j){
      if(map[i][j]!=' ') map[i][j]=' ';
      mark[i][j]=1;}

    for(int i=y+2;i<=y+4;++i) {
     if(map[x-4][i]!=' ') map[x-4][i]=' ';
     mark[x-4][i]=1;}

    for(int i=x-2;i>=x-3;--i){
     if(map[i][y+5]!=' ') map[i][y+5]=' ';
     mark[i][y+5]=1;}
} 

void form(int x,int y){
    //
    int xp=x-3; int xpp=xp-2; int yp=y+2; 

     map[x][y]='+';
    for(int i=1;i<=3;++i)  map[x][y+i]='-';
     map[x][y+4]='+';

     map[xp][y]='+';
    for(int i=1;i<=3;++i)  map[xp][y+i]='-';
     map[xp][y+4]='+';

     map[xpp][yp]='+';
    for(int i=1;i<=3;++i)  map[xpp][yp+i]='-';
     map[xpp][yp+4]='+';
    //

    //
     map[x-1][y]='|';
     map[x-2][y]='|';

     map[x-1][y+4]='|';
     map[x-2][y+4]='|';

     map[x-3][y+6]='|';
     map[x-4][y+6]='|';
    //

    //
     map[x-4][y+1]='/';
     map[x-4][y+5]='/';
     map[x-1][y+5]='/';
    //

    //
     map[x-2][y+6]='+';
    //

    fix(x,y);

}
void show(){
    for(int i=k;i<=999;++i){
      for(int j=1;j<=l;++j)
        printf("%c",map[i][j]);
    puts("");
    }
}
int main()
{   
    for(int i=0;i<1000;++i) for(int j=0;j<1000;++j) map[i][j]=' '; 

    scanf("%d%d",&m,&n);

    l=4*n+1+2*m;

    for(int i=m;i>=1;--i) for(int j=1;j<=n;++j) scanf("%d",&num[i][j]);

    for(int i=m;i>=1;--i)
     for(int j=1;j<=n;++j){
        int bx=999-2*(i-1);
        int by=1+2*(i-1)+4*(j-1);
        for(int k=1;k<=num[i][j];++k)
         form(bx-3*(k-1),by);
     }

    for(int i=0;i<1000;++i)
     for(int j=0;j<1000;++j){
      if(!mark[i][j]&&map[i][j]==' ') map[i][j]='.';
      if(map[i][j]!='.'&&flag==false) {k=i;flag=true;}
    }
    show();
    return 0;
}