题解: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;
}
千万别点赞