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]=='') cout<<".";//只有没画过的才是".” 
            else{
                cout<<ma[i][j];//输出就好 
            }
        }
        cout<<endl;
    }
    return 0;
 }
Ac
原文地址:https://www.cnblogs.com/For-Miku/p/12310104.html