题解:P1058 [NOIP 2008 普及组] 立体图

· · 题解

题目传送门:

P1058题目传送门

基本思路:

最讨厌这种题了

其实一开始一看也很懵,但仔细一想就开窍了

像这种无耻地让我们输出图案的题目,其实我们可以从后往前来填充方块

比如样例:

......+---+---+...+---+
..+---+  /   /|../   /|
./   /|-+---+ |.+---+ |
+---+ |/   /| +-|   | +
|   | +---+ |/+---+ |/|
|   |/   /| +/   /|-+ |
+---+---+ |/+---+ |/| +
|   |   | +-|   | + |/.
|   |   |/  |   |/| +..
+---+---+---+---+ |/...
|   |   |   |   | +....
|   |   |   |   |/.....
+---+---+---+---+......

我们可以先填这个:

        |    
......+-V-+---+...+---+
..+---+  /   /|../   /|
./   /|-+---+ |.+---+ |
+---+ |/   /| +-|   | +
|   | +---+ |/+---+ |/|
|   |/   /| +/   /|-+ |
+---+---+ |/+---+ |/| +
|   |   | +-|   | + |/.
|   |   |/  |   |/| +..
+---+---+---+---+ |/...
|   |   |   |   | +....
|   |   |   |   |/.....
+---+---+---+---+......

再填这个:

            |
......+---+-V-+...+---+
..+---+  /   /|../   /|
./   /|-+---+ |.+---+ |
+---+ |/   /| +-|   | +
|   | +---+ |/+---+ |/|
|   |/   /| +/   /|-+ |
+---+---+ |/+---+ |/| +
|   |   | +-|   | + |/.
|   |   |/  |   |/| +..
+---+---+---+---+ |/...
|   |   |   |   | +....
|   |   |   |   |/.....
+---+---+---+---+......

填完这一行后,再填下一行,以此类推…… 这样,让这个数组一次次覆盖,最终形成最后的图案。

最后输出,别忘了背景

然后就没了

就没了

代码之前:

1.可以建一个二维字符数组用来存储

  +---+
 /   /|
+---+ | <-这个东西
|   | +
|   |/ 
+---+  

2.再建一个二维字符数组用来存储最终图案

3.应该没了

代码

终于到你们最喜欢的代码了~

代码( )坑,可安息食用

#include <iostream>
#define max(a,b) a>b?a:b
#defie min(a,b) a<b?a:b
using namespace std;
int m,n,x=3000,y=1000,_y,a=2147483647,b,c,d=-2147483648,_x;
//a,b,c,d是上下左右限
int zb[51][51];
char ans[4005][4005];
char ch[8][8]={"..+---+","./   /|","+---+ |","|   | +","|   |/.","+---+.."};
/*
  +---+
 /   /|
+---+ |
|   | +
|   |/ 
+---+  
*/
int main(){
    ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
    cin>>m>>n;
    for(int i=1;i<=m;++i){
        for(int j=1;j<=n;++j){
            cin>>zb[i][j];
        }
    }
    for(int i=1;i<=m;++i){
        _y=y;
        for(int j=1;j<=n;++j){
            _x=x;
            _x-=5;
            for(bool k=1;k<=zb[i][j];++k){//填充一个方块
                for(int l=0;l<=5;++l){
                    for(int o=0;o<=5;++o){
                        if(ch[l][o]!='.'){
                            ans[x+l][_y+o]=ch[1][o];
                            //填充
                        }
                    }
                }
                _x-=3;
            }
            a=min(a,_x+3);
            _y+=4;//下一列
        }
        x+=2;
        y-=2;//下一行
        d=min(d,_y+2);
    }
    b=x-2;
    c=y+2;
    for(int i=a;i<=b;++i){
        for(int j=c;j<=d;++i){
            if(ans[i][j]){
                cout<<'.';//背景
            }else{
                cout<<ans[i][j];
            }
        }
        cout<<'\n';
    }
    return 0;
}

千万别点赞