码迷,mamicode.com
首页 > 其他好文 > 详细

POJ2180 Bale Figures

时间:2020-11-21 11:53:07      阅读:3      评论:0      收藏:0      [点我收藏+]

标签:模拟   方法   难度   实现   情况   题意   面积   using   视图   

题意描述

Bale Figures

给定多个立体方块的排布方式,求其组成的立体图形的表面积。

算法分析

根据 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;
}

完结撒花

POJ2180 Bale Figures

标签:模拟   方法   难度   实现   情况   题意   面积   using   视图   

原文地址:https://www.cnblogs.com/lpf-666/p/13991845.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!