NC16620. [NOIP2008]立体图
描述
输入描述
第一行有用空格隔开的两个整数m和n,表示有m*n个格子(1 ≤ m,n ≤ 50)。
接下来的m行,是一个m*n的矩阵,每行有n个用空格隔开的整数,其中第i行第j列上的整数表示第i行第j列的格子上摞有多少个积木(1 ≤ 每个格子上的积木 ≤ 100)。
输出描述
题目要求的立体图,是一个K行L列的字符矩阵,其中K和L表示最少需要K行L列才能按规定输出立体图。
示例1
输入:
3 4 2 2 1 2 2 2 1 1 3 2 1 2
输出:
......+---+---+...+---+ ..+---+ / /|../ /| ./ /|-+---+ |.+---+ | +---+ |/ /| +-| | + | | +---+ |/+---+ |/| | |/ /| +/ /|-+ | +---+---+ |/+---+ |/| + | | | +-| | + |/. | | |/ | |/| +.. +---+---+---+---+ |/... | | | | | +.... | | | | |/..... +---+---+---+---+......
C++11(clang++ 3.9) 解法, 执行用时: 5ms, 内存消耗: 512K, 提交时间: 2019-10-20 18:40:59
#include<bits/stdc++.h> using namespace std; int n,m,f[55][55],X,Y; char biao[10][10]={ " +---+", " / /|", "+---+ |", "| | +", "| |/", "+---+", }; int l[6]={2,1,0,0,0,0},r[6]={6,6,6,6,5,4}; char ans[1001][1001]; void fugai(int x,int y) { for(int i=5;i>=0;i--) { for(int j=l[i];j<=r[i];j++) { ans[5-i+x][j+y]=biao[i][j]; X=max(X,5-i+x); Y=max(j+y,Y); } } } int main() { cin>>n>>m; for(int i=1;i<=n;i++) for(int j=0;j<m;j++) cin>>f[i][j]; for(int i=1;i<=n;i++) for(int j=0;j<m;j++) for(int k=0;k<f[i][j];k++) { fugai((n-i)*2+1+3*k,(n-i)*2+1+4*j); } for(int i=X;i>=1;i--) { for(int j=1;j<=Y;j++) { if(ans[i][j]=='\0') printf("."); else printf("%c",ans[i][j]); } printf("\n"); } return 0; }
C++14(g++5.4) 解法, 执行用时: 5ms, 内存消耗: 1380K, 提交时间: 2019-10-19 08:14:55
#include<bits/stdc++.h> using namespace std; char ans[1005][1005]; char unit[10][10]= { "..+---+", "./ /|", "+---+ |", "| | +", "| |/.", "+---+..", }; void plant(int sx,int sy) { for(int i=0; i<6; i++) for(int j=0; j<7; j++) if(unit[i][j]!='.') ans[sx+i][sy+j]=unit[i][j]; } int main() { memset(ans,'.',sizeof(ans)); int n,m,w,l=0; cin>>m>>n; int uper[m][n]; w=n*4+1+m*2; for(int i=0; i<m; i++) for(int j=0; j<n; j++) { cin>>uper[i][j]; l=max(l,uper[i][j]*3+1+(m-i)*2); } for(int i=0; i<m; i++) for(int j=0; j<n; j++) for(int k=1; k<=uper[i][j]; k++) plant(l-(k*3)-2*(m-i),j*4+1+(m-i-1)*2); for(int i=1; i<=l; i++) { for(int j=1; j<=w; j++) cout<<ans[i][j]; cout<<endl; } return 0; }