标签:模拟 方法 难度 实现 情况 题意 面积 using 视图
给定多个立体方块的排布方式,求其组成的立体图形的表面积。
根据 CSP-2020 可以看出,签到题的模式可能由数学题变为大模拟。
那么这种情况下多做思维难度不高,又需要代码能力的模拟题变的尤为重要。
这便是一道签到好题(确信
首先介绍一个很好想但是错误的思路。
一开始我的思路是构建俯视图,然后在俯视图的方块上标数字表示方块数量。
然后根据 xxs 都知道的方法求解表面积。
但是我看到了这样一句话:
The bales can be glued and require no underlying support if extended over an empty space.
大意就是方块有很强的粘性,可以悬空,那么以上方法就当场枪毙。
下面介绍正解。
观察数据范围,发现方块最多也才 \(25000\) 个,那么显然我们可以直接模拟。
具体方法是记录下每个方块的 x,y,z
坐标,同时用数组记录方块的放置情况。
第一个方块为了方便处理可以放在正中央 \((30,30,0)\) 的位置。
那么每次读入都只需要进行微调即可,同时读入时顺便判断无解情况。
统计答案时更加暴力,直接枚举每个方块的六个方向,看有没有方块,没有就 ans++
。
#include<cstdio>
#include<cstring>
#include<algorithm>
#define N 25010
using namespace std;
int n,a[100][100][50];
struct node{
int x,y,z;
}p[N];
int read(){
int x=0,f=1;char c=getchar();
while(c<‘0‘ || c>‘9‘) f=(c==‘-‘)?-1:1,c=getchar();
while(c>=‘0‘ && c<=‘9‘) x=x*10+c-48,c=getchar();
return x*f;
}
int main(){
n=read();
p[1].x=30,p[1].y=30,p[1].z=0;
a[30][30][0]=true;
char typ[3];
for(int i=2;i<=n;i++){
int now=read();scanf("%s",typ);
int x=p[now].x;
int y=p[now].y;
int z=p[now].z;
if(typ[0]==‘L‘) --y;
else if(typ[0]==‘R‘) ++y;
else if(typ[0]==‘F‘) ++x;
else if(typ[0]==‘B‘) --x;
else if(typ[0]==‘O‘) ++z;
else if(typ[0]==‘U‘) --z;
if(z<0 || a[x][y][z]) {puts("-1");return 0;}
a[x][y][z]=true;
p[i].x=x,p[i].y=y,p[i].z=z;
}
int ans=0;
for(int x=0;x<60;x++)
for(int y=0;y<60;y++)
for(int z=0;z<30;z++)
if(a[x][y][z]){
//printf("%d %d %d\n",x,y,z);
if(x-1>=0 && !a[x-1][y][z]) ++ans;
if(x+1<60 && !a[x+1][y][z]) ++ans;
if(y-1>=0 && !a[x][y-1][z]) ++ans;
if(y+1<60 && !a[x][y+1][z]) ++ans;
if(z-1>=0 && !a[x][y][z-1]) ++ans;
if(z+1<30 && !a[x][y][z+1]) ++ans;
//printf("%d\n",ans);
}
printf("%d\n",ans);
return 0;
}
完结撒花
标签:模拟 方法 难度 实现 情况 题意 面积 using 视图
原文地址:https://www.cnblogs.com/lpf-666/p/13991845.html