P1058 立体图
链接:Miku
------------------------------
蒟蒻在线%lmk,ljx,lpy,yyq大佬们
------------------------------
Good Night Good luck
---------------------------
这是一道巨大的模拟题,我的做法是创建一块大画布,然后从后往前覆盖即可,具体实现,离不开代码
-----------------------------
#include<iostream> #include<cstdio> using namespace std; int m,n; char sin[10][10]={ " +---+", " / /|", "+---+ |", "| | +", "| |/", "+---+", }; char ma[1005][1005]; int maxx; int maxy; int l[6]={2,1,0,0,0,0}; int r[6]={6,6,6,6,5,4}; int mapp[1001][1001]; void draw(int x,int y){ for(int i=5;i>=0;--i){//倒序 for(int j=l[i];j<=r[i];j++){//题目有要求,为了避免和正方体内部 // 空格搞混,就采用这种方法 //就是解决左上角那一块 ma[5-i+x][j+y]=sin[i][j];//倒着的哦 maxx=max(maxx,x+5-i);//算最大值?边画边记 maxy=max(maxy,j+y); } } } int main(){ scanf("%d%d",&n,&m); for(int i=1;i<=n;++i){ for(int j=0;j<m;++j){//由于左下角是0,0,所以从0开始 scanf("%d",&mapp[i][j]); } } for(int i=1;i<=n;++i){//行 for(int j=0;j<m;++j){//列 for(int k=0;k<mapp[i][j];k++){//高度 draw((n-i)*2+1+3*k,(n-i)*2+1+4*j); //这里的n-i就相当找到了这一行最左边那一个的左下角 //坐标 //然后根据它的从左到右第几个以及高度修正 } } } for(int i=maxx;i>=1;i--){//倒叙输出 for(int j=1;j<=maxy;j++){//从左到右倒是不用 if(ma[i][j]=='\0') cout<<".";//只有没画过的才是".” else{ cout<<ma[i][j];//输出就好 } } cout<<endl; } return 0; }