AOJ 664彩灯高高挂

彩灯高高挂
Time Limit: 1000 ms   Case Time Limit: 1000 ms   Memory Limit: 64 MB
Total Submission: 53   Submission Accepted: 23
Description
Bran收到了好友的一个礼物——彩灯。彩灯是一个n×n×n的正方体,由n×n×n个小正方体组成,每个小正方体都是一个小彩灯。我们用坐标(x,y,z)(0≤x,y,z<n)来表示各个小彩灯,那么有彩灯(x,y,z)与彩灯(x-1,y,z),(x+1,y,z),(x,y-1,z),(x,y+1,z),(x,y,z-1),(x,y,z+1)们相邻(如果这些彩灯坐标合法的话)。初始时,有些小彩灯是亮着的,并有各自的颜色,颜色用正整数表示。之后的每一秒,对于所有关着的小彩灯,如果它与某个开着的小彩灯相邻,那么关着的小灯就会开启,并且灯的颜色与这个灯的相同;如果与多个亮着的灯相邻,那么灯的颜色为那些开着的邻灯中值最小的一个。
如此,一定时间后,所有的小彩灯都会亮起来,请求出各个小彩灯的颜色。


Input
第1行:测试数据组数t;
接下来依次是这t组数据,对于每一组数据:
第1行:n m;n含义如上,m表示初始时亮着的小彩灯数量,有1≤n≤40,且1≤m≤n 3
接下来的m行中,第i(1≤i≤m)行为三个整数x y z,表示小彩灯(x,y,z)初始时是亮的,且颜色是i,保证有0≤x,y,z<n;
第n+2行:空行。

Output
一组测试数据占一行,对于每组测试数据:
输出m个数,第i个数表示颜色为i的小彩灯的数量,这m个数之间用单个空格两亮隔开,具体参考输入输出样例。

Sample Input
OriginalTransformed
3
2 8
0 0 0
0 0 1
0 1 0
0 1 1
1 0 0
1 0 1
1 1 0
1 1 1

3 1
1 1 1

5 4
0 2 4
2 0 0
3 4 4
4 1 2

3[EOL] 
2[SP]8[EOL] 
0[SP]0[SP]0[EOL] 
0[SP]0[SP]1[EOL] 
0[SP]1[SP]0[EOL] 
0[SP]1[SP]1[EOL] 
1[SP]0[SP]0[EOL] 
1[SP]0[SP]1[EOL] 
1[SP]1[SP]0[EOL] 
1[SP]1[SP]1[EOL] 
[EOL] 
3[SP]1[EOL] 
1[SP]1[SP]1[EOL] 
[EOL] 
5[SP]4[EOL] 
0[SP]2[SP]4[EOL] 
2[SP]0[SP]0[EOL] 
3[SP]4[SP]4[EOL] 
4[SP]1[SP]2[EOL] 
[EOL] 
[EOF] 

Sample Output
OriginalTransformed
1 1 1 1 1 1 1
27
38 28 32 27
1[SP]1[SP]1[SP]1[SP]1[SP]1[SP]1[EOL] 
27[EOL] 
38[SP]28[SP]32[SP]27[EOL] 
[EOF] 

Source
安徽大学第六届程序设计竞赛网络赛
#include<iostream>
#include<cstring>
using namespace std;
int n,m;
int x[100000],y[100000],z[100000];
int qu[100000],map[50][50][50];
int dir[6][3]={{-1,0,0},{0,-1,0},{0,0,-1},{1,0,0},{0,1,0},{0,0,1}};
int as[100000];
int main()
{
	int t;
	cin>>t;
	int head,rear;
	int a,b,c,i,j,k;
	while(t--)
	{
		memset(map,0,sizeof(map));
		memset(as,0,sizeof(as));
		head=0,rear=0;
		cin>>n>>m;
		for(i=1;i<=m;i++)
		{
			cin>>a>>b>>c;
			x[rear]=a;
			y[rear]=b;
			z[rear]=c;
			map[a][b][c]=i;
			qu[rear++]=i;
		}
		while(head<rear)
		{
			int ii=qu[head],xx=x[head],yy=y[head],zz=z[head++];
			for(i=0;i<6;i++)
			{
				int fx=xx+dir[i][0];
				int fy=yy+dir[i][1];
				int fz=zz+dir[i][2];
				if(fx>=0&&fx<n&&fy>=0&&fy<n&&fz>=0&&fz<n&&!map[fx][fy][fz])
				{
					qu[rear]=map[xx][yy][zz];
					x[rear]=fx;
					y[rear]=fy;
					z[rear++]=fz;
					map[fx][fy][fz]=map[xx][yy][zz];
				}
			}
		}
		for(i=0;i<n;i++)
		{
			for(j=0;j<n;j++)
			{
				for(k=0;k<n;k++)
				{
					as[map[i][j][k]]++;
				}
			}
		}
		for(i=1;i<=m;i++)
		{
			if(i==1) cout<<as[i];
			else cout<<" "<<as[i];
		}
		cout<<endl;
	}
	return 0;
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值