题解 P1058 【立体图】
Conical
2017-05-26 17:18:45
此题是一个大模拟,作为pj的T4,思维和代码都有一点难度(dalao勿喷)。
很容易想到一种方法,将单个方块的图案存下来,然后找到画布中每个方块的对应坐标,copy即可
关键在于两点
1. ** 摆放顺序 **
显而易见,我们应当从后往前,从下往上,从左往右进行摆放,这样可以处理好遮挡的问题,因为此题的观察视角是右上方(相对于积木而言),如果本题的观察视角改变,处理的顺序也需要改变。
2. ** 坐标的计算 **
分析完处理顺序后,我们就需要计算画布中方块的对应坐标了。这里不需要找出方块的所有坐标,只需找出某一特殊点(如顶点)即可。怎么计算呢,当然是观察法找规律了。
我的代码中计算的是左下角的顶点。
附代码
```cpp
#include<stdio.h>
#include<iostream>
using namespace std;
const char Stick[6][8]=
{
"..+---+",
"./ /|",
"+---+ |",
"| | +",
"| |/.",
"+---+.."
};//单个方块
int a[55][55];
char Paint[550][550];//画布
inline void Draw(int x,int y)//涂鸦函数
{
int i,j;
for(i=0;i<6;i++)
for(j=0;j<7;j++)
if(Stick[6-i-1][j]!='.')
Paint[x-i][y+j]=Stick[6-i-1][j];//放置方块
}
int main()
{
int N,M,K(0),L,i,j,x,y;
scanf("%d%d",&N,&M);
L=4*M+2*N+1;//计算画布宽度
for(i=1;i<=N;i++)
for(j=1;j<=M;j++)
{
scanf("%d",&a[i][j]);
K=max(K,a[i][j]*3+2*(N-i+1)+1);//计算画布长度
}
for(i=1;i<=K;i++)
for(j=1;j<=L;j++)
Paint[i][j]='.';//画布初始化
for(i=1;i<=N;i++)
for(j=1;j<=M;j++)
{
x=K-2*(N-i);
y=2*(N-i)+4*(j-1)+1;//计算坐标
while(a[i][j]--)
{
Draw(x,y);//涂鸦
x-=3;//向上放
}
}
for(i=1;i<=K;i++)
{
for(j=1;j<=L;j++)
printf("%c",Paint[i][j]);
printf("\n");
}//打印画布
return 0;
}
```