bzoj 3234: [Ahoi2013]立方体

题目链接:http://www.lydsy.com:808/JudgeOnline/problem.php?id=3234

题意:求长方体交的表面积。

思路:flood-fill

const int N=205;



int f[N][N][N];

bool visit[N][N][N];

int n;





int dx[]={1,-1,0,0,0,0};

int dy[]={0,0,1,-1,0,0};

int dz[]={0,0,0,0,1,-1};



queue<pair<int,pair<int,int> > > Q;





int main()

{



	n=getInt();

	int i;



	int maxX=0,maxY=0,maxZ=0;

	int minX=222,minY=222,minZ=222;



	for(i=1;i<=n;i++) 

	{

		int x1=getInt(),y1=getInt(),z1=getInt();

		int x2=getInt(),y2=getInt(),z2=getInt();

		x1++;

		y1++;

		z1++;

		x2++;

		y2++;

		z2++;

		f[x1][y1][z1]++;

		f[x1][y1][z2]--; f[x1][y2][z1]--; f[x2][y1][z1]--;

		f[x2][y2][z1]++; f[x2][y1][z2]++; f[x1][y2][z2]++;

		f[x2][y2][z2]--;



		minX=min(minX,x1);

		minY=min(minY,y1);

		minZ=min(minZ,z1);



		maxX=max(maxX,x2+2);

		maxY=max(maxY,y2+2);

		maxZ=max(maxZ,z2+2);

	}





	int j,k;

	for(i=minX;i<=maxX;i++) for(j=minY;j<=maxY;j++) for(k=minZ;k<=maxZ;k++)

	{

		f[i][j][k]+=f[i-1][j][k]+f[i][j-1][k]+f[i][j][k-1];

		f[i][j][k]-=f[i-1][j-1][k]+f[i-1][j][k-1]+f[i][j-1][k-1];

		f[i][j][k]+=f[i-1][j-1][k-1];

	}



	Q.push(MP(maxX,MP(maxY,maxZ)));

	visit[maxX][maxY][maxZ]=1;

	int ans=0;

	while(!Q.empty())

	{

		int x=Q.front().first;

		int y=Q.front().second.first;

		int z=Q.front().second.second;

		Q.pop();



		for(i=0;i<6;i++)

		{

			int xx=x+dx[i];

			int yy=y+dy[i];

			int zz=z+dz[i];

			if(xx>=minX-1&&xx<=maxX&&yy>=minY-1&&yy<=maxY&&zz>=minZ-1&&zz<=maxZ&&!visit[xx][yy][zz])

			{

				if(f[xx][yy][zz]) ans++;

				else Q.push(MP(xx,MP(yy,zz))),visit[xx][yy][zz]=1;

			}

		}

	}

	printf("%d\n",ans);

}

 

你可能感兴趣的:(ZOJ)