P1058 [NOIP2008 普及组] 立体图
模拟赛时候要是做出来这题就能拿饮料了:(
思路
先打个输出长方体的函数:(其中\((x,y)\)表示该长方体的左上角)
void draw(int x,int y)
{
c[x][y+2]='+';c[x][y+6]='+';c[x+2][y]='+';c[x+2][y+4]='+';
c[x+5][y]='+';c[x+5][y+3]='+';c[x+5][y+4]='+';c[x+3][y+6]='+';
c[x][y+3]='-';c[x][y+4]='-';c[x][y+5]='-';
c[x+2][y+1]='-';c[x+2][y+2]='-';c[x+2][y+3]='-';
c[x+5][y+1]='-';c[x+5][y+2]='-';c[x+5][y+3]='-';
c[x+1][y+1]='/';c[x+1][y+5]='/';c[x+4][y+5]='/';
c[x+1][y+6]='|';c[x+2][y+6]='|';c[x+3][y]='|';
c[x+4][y]='|';c[x+3][y+4]='|';c[x+4][y+4]='|';
c[x+2][y+5]=' ';c[x+3][y+1]=' ';c[x+3][y+2]=' ';c[x+3][y+3]=' ';
c[x+3][y+5]=' ';c[x+4][y+1]=' ';c[x+4][y+2]=' ';c[x+4][y+3]=' ';
c[x+1][y+2]=' ';c[x+1][y+3]=' ';c[x+1][y+4]=' ';
}
接着,就是去找到每一个长方体的左上角的坐标,找规律即可得到:(这里将左下角的格子看作是\(1,1\))
x=(i-1)*2+4+3*(k-1)+1;
y=2*(n-i)+4*(j-1)+1;
那么整个图形的长宽就是每个\(x,y\)的最大值加上对应补上的值(因为我们这是算的左上角坐标,并不是完整坐标
其中的\(k\)表示当前处于第\(k\)层,我是用了一个三维数组存:
\(a_{i,j,k}\)表示坐标为\((i,j)\)处,第\(k\)层的数的左上角坐标
最后,先枚举每一层(即\(k\)),再从后往前画,也就是倒着枚举\(i,j\),每次画一下对应的长方体即可
还有一点需要注意,因为我们假设的\((1,1)\)是左下角(这样推式子方便),与题目不符,所以每次画的时候都需要将其转化为题目所要求的(具体可见代码)
这里的输入也要倒序输入,因为我的式子也是基于他倒序的情况之下的
代码
#include<bits/stdc++.h>
#define int long long
using namespace std;
int n,m,dn,dm,maxn;
char c[1010][1010];
struct pos
{
int x,y,data;
}a[60][60][110];
void draw(int ,int y);
void print()
{
for(int i=1;i<=dn+1;i++)
{
for(int j=1;j<=dm+6;j++)
{
cout<<c[i][j];
}
cout<<endl;
}
cout<<endl;
}
signed main(){
ios::sync_with_stdio(0);
cin.tie(0);cout.tie(0);
for(int i=1;i<=1000;i++)
for(int j=1;j<=1000;j++)
c[i][j]='.';
cin>>n>>m;
for(int i=n;i>=1;i--)
{
for(int j=m;j>=1;j--)
{
cin>>a[i][j][0].data;
for(int k=1;k<=a[i][j][0].data;k++)
{
a[i][j][k].x=(i-1)*2+4+3*(k-1)+1;
a[i][j][k].y=2*(n-i)+4*(j-1)+1;
dn=max(dn,a[i][j][k].x);
dm=max(dm,a[i][j][k].y);
}
maxn=max(maxn,a[i][j][0].data);
}
}
for(int k=1;k<=maxn;k++)
{
for(int i=n;i>=1;i--)
{
for(int j=m;j>=1;j--)
{
if(a[i][j][0].data<k) continue;
draw(dn+1-a[i][j][k].x,dm+1-a[i][j][k].y);
//这里就是将坐标转为题目所述的
}
}
}
print();
system("echo. & pause");
return 0;
}
void draw(int x,int y)
{
c[x][y+2]='+';c[x][y+6]='+';c[x+2][y]='+';c[x+2][y+4]='+';
c[x+5][y]='+';c[x+5][y+3]='+';c[x+5][y+4]='+';c[x+3][y+6]='+';
c[x][y+3]='-';c[x][y+4]='-';c[x][y+5]='-';
c[x+2][y+1]='-';c[x+2][y+2]='-';c[x+2][y+3]='-';
c[x+5][y+1]='-';c[x+5][y+2]='-';c[x+5][y+3]='-';
c[x+1][y+1]='/';c[x+1][y+5]='/';c[x+4][y+5]='/';
c[x+1][y+6]='|';c[x+2][y+6]='|';c[x+3][y]='|';
c[x+4][y]='|';c[x+3][y+4]='|';c[x+4][y+4]='|';
c[x+2][y+5]=' ';c[x+3][y+1]=' ';c[x+3][y+2]=' ';c[x+3][y+3]=' ';
c[x+3][y+5]=' ';c[x+4][y+1]=' ';c[x+4][y+2]=' ';c[x+4][y+3]=' ';
c[x+1][y+2]=' ';c[x+1][y+3]=' ';c[x+1][y+4]=' ';
}
标签:int,Luogu,立体图,NOIP2008,--,坐标,左上角,长方体
From: https://www.cnblogs.com/lyk2010/p/17924872.html