专栏文章

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

P1058题解参与者 14已保存评论 13

文章操作

快速查看文章及其快照的属性,并进行相关操作。

当前评论
13 条
当前快照
1 份
快照标识符
@miq8n78j
此快照首次捕获于
2025/12/04 00:45
3 个月前
此快照最后确认于
2025/12/04 00:45
3 个月前
查看原文

题目传送门:

基本思路:

最讨厌这种题了

其实一开始一看也很懵,但仔细一想就开窍了
像这种无耻地让我们输出图案的题目,其实我们可以从后往前来填充方块
比如样例:
CPP
......+---+---+...+---+
..+---+  /   /|../   /|
./   /|-+---+ |.+---+ |
+---+ |/   /| +-|   | +
|   | +---+ |/+---+ |/|
|   |/   /| +/   /|-+ |
+---+---+ |/+---+ |/| +
|   |   | +-|   | + |/.
|   |   |/  |   |/| +..
+---+---+---+---+ |/...
|   |   |   |   | +....
|   |   |   |   |/.....
+---+---+---+---+......
我们可以先填这个:
CPP
        |    
......+-V-+---+...+---+
..+---+  /   /|../   /|
./   /|-+---+ |.+---+ |
+---+ |/   /| +-|   | +
|   | +---+ |/+---+ |/|
|   |/   /| +/   /|-+ |
+---+---+ |/+---+ |/| +
|   |   | +-|   | + |/.
|   |   |/  |   |/| +..
+---+---+---+---+ |/...
|   |   |   |   | +....
|   |   |   |   |/.....
+---+---+---+---+......
再填这个:
CPP
            |
......+---+-V-+...+---+
..+---+  /   /|../   /|
./   /|-+---+ |.+---+ |
+---+ |/   /| +-|   | +
|   | +---+ |/+---+ |/|
|   |/   /| +/   /|-+ |
+---+---+ |/+---+ |/| +
|   |   | +-|   | + |/.
|   |   |/  |   |/| +..
+---+---+---+---+ |/...
|   |   |   |   | +....
|   |   |   |   |/.....
+---+---+---+---+......
填完这一行后,再填下一行,以此类推…… 这样,让这个数组一次次覆盖,最终形成最后的图案。
最后输出,别忘了背景
然后就没了
就没了

代码之前:

1.可以建一个二维字符数组用来存储
CPP
  +---+
 /   /|
+---+ | <-这个东西
|   | +
|   |/ 
+---+  
2.再建一个二维字符数组用来存储最终图案
3.应该没了

代码

终于到你们最喜欢的代码了~
代码( )坑,可安息食用
CPP
#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;
}

千万别点赞

评论

13 条评论,欢迎与作者交流。

正在加载评论...