记录编号 148680 评测结果 AAAAAAAAAA
题目名称 [Vocaloid]细菌污染 最终得分 100
用户昵称 Gravatar水中音 是否通过 通过
代码语言 C++ 运行时间 0.632 s
提交时间 2015-02-14 11:56:12 内存使用 36.49 MiB
显示代码纯文本
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
const int QWQ=1000000;
int X,Y,Z,h,w,n,zj1,zj2,zj3,i,tempx,tempy,tempz,ans=0,Sum1=0,Sum2=0,Sum3=0;
bool flag[101][101][101]={0},flag2[101][101][101]={0};
int setx[2][QWQ]={0},sety[2][QWQ]={0},setz[2][QWQ]={0};//当前分面接触侵染点的点
int waitx[QWQ]={0},waity[QWQ]={0},waitz[QWQ]={0};
int blood[101][101][101];//剩余生命值
int Addx[6]={0, 0,0, 0,1,-1};
int Addy[6]={0, 0,1,-1,0, 0};
int Addz[6]={1,-1,0, 0,0, 0};
//--------------输入--------------------------
void init()
{
	scanf("%d%d%d",&X,&Y,&Z);
	scanf("%d%d%d",&h,&w,&n);
	for(zj1=1;zj1<=X;zj1++)
	for(zj2=1;zj2<=Y;zj2++)
	for(zj3=1;zj3<=Z;zj3++)
	blood[zj1][zj2][zj3]=h;
	int x_1,x_2,y_1,y_2,z_1,z_2;
	for(i=1;i<=n;i++)
	{
		scanf("%d%d%d%d%d%d",&x_1,&x_2,&y_1,&y_2,&z_1,&z_2);
		for(zj1=x_1;zj1<=x_2;zj1++)
		for(zj2=y_1;zj2<=y_2;zj2++)
		for(zj3=z_1;zj3<=z_2;zj3++)
		flag[zj1][zj2][zj3]=1,blood[zj1][zj2][zj3]=0;
	}
}
//----------------------预处理----------------------------
void bfs(int x,int y,int z)
{
	bool ok;
	waitx[++Sum3]=x,waity[Sum3]=y,waitz[Sum3]=z,flag2[x][y][z]=1;
	while(Sum3)
	{
		x=waitx[Sum3],y=waity[Sum3],z=waitz[Sum3],Sum3--,ok=0;
		for(i=0;i<6;i++)
		{
			tempx=x+Addx[i],tempy=y+Addy[i],tempz=z+Addz[i];
			if(tempx<=X&&tempx>0&&tempy<=Y&&tempy>0&&tempz<=Z&&tempz>0)
			if(!flag[tempx][tempy][tempz])
			{
				if(!flag2[tempx][tempy][tempz])
				{
					waitx[++Sum3]=tempx,waity[Sum3]=tempy,waitz[Sum3]=tempz;
					flag2[tempx][tempy][tempz]=1;
				}
			}
			else ok=1;
		}
		if(ok)setx[0][++Sum1]=x,sety[0][Sum1]=y,setz[0][Sum1]=z;
	}
}
void prework()
{
	for(zj1=1;zj1<=X;zj1++)
	for(zj2=1;zj2<=Y;zj2++)
	for(zj3=1;zj3<=Z;zj3++)
	if(!flag[zj1][zj2][zj3]&&!flag2[zj1][zj2][zj3])
	bfs(zj1,zj2,zj3);
	memset(flag2,0,sizeof(flag2));
	for(i=1;i<=Sum1;i++)
	flag2[setx[0][i]][sety[0][i]][setz[0][i]]=1;
}
//----------------------循环查找---------------------------
void work()
{
	int x,y,z,num;
	zj1=0,zj2=1;
	while(Sum1)
	{
		ans++;
		while(Sum1)
		{
			x=setx[zj1][Sum1],y=sety[zj1][Sum1],z=setz[zj1][Sum1],Sum1--,num=0;
			for(i=0;i<6;i++)
			{
				tempx=x+Addx[i],tempy=y+Addy[i],tempz=z+Addz[i];
				if(tempx<=X&&tempx>0&&tempy<=Y&&tempy>0&&tempz<=Z&&tempz>0)
				if(flag[tempx][tempy][tempz])num++;
			}
			blood[x][y][z]-=num*w;
			if(blood[x][y][z]<=0)waitx[++Sum3]=x,waity[Sum3]=y,waitz[Sum3]=z;
			else setx[zj2][++Sum2]=x,sety[zj2][Sum2]=y,setz[zj2][Sum2]=z;
		}
		while(Sum3)
		{
            x=waitx[Sum3],y=waity[Sum3],z=waitz[Sum3],flag[x][y][z]=1,Sum3--;
			for(i=0;i<6;i++)
			{
				tempx=x+Addx[i],tempy=y+Addy[i],tempz=z+Addz[i];
				if(tempx<=X&&tempx>0&&tempy<=Y&&tempy>0&&tempz<=Z&&tempz>0)
				if(blood[tempx][tempy][tempz]>0&&!flag2[tempx][tempy][tempz])
				{
					setx[zj2][++Sum2]=tempx,sety[zj2][Sum2]=tempy,setz[zj2][Sum2]=tempz;
					flag2[tempx][tempy][tempz]=1;
				}
			}
		}
		zj1^=1,zj2^=1;
		zj3=Sum1,Sum1=Sum2,Sum2=zj3;
	}
	printf("%d\n",ans);
}
int main()
{
    freopen("Karune.in","r",stdin);
	freopen("Karune.out","w",stdout);
	init();
	prework();
	work();
	//while(1);
	return 0;
}