炒鸡好玩的一道题。
主要就是先画后面的,再画前面的,这样前面的方块就会把后面的覆盖掉。
于是就纯模拟。
#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;
}