题解 P1058 【立体图】
Future_Fate · · 题解
#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;
}