AOJ-AHU-OJ-664 彩灯高高挂
2014-03-28 16:51
351 查看
彩灯高高挂
Time Limit: 1000 ms Case Time Limit: 1000 ms Memory Limit: 64 MB
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≤n3;
接下来的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
Sample Output
Source
安徽大学第六届程序设计竞赛网络赛
————————————————————忧桑的分割线————————————————————
思路:此题微虐啊。。。看的粗来,此题是BFS(弱菜的我当时却没能看粗来)。需要注意的地方如下:
1.三维 2.多起点 3.访问过的节点标记为它父节点的id
代码如下:
[align=center]
[/align]
Time Limit: 1000 ms Case Time Limit: 1000 ms Memory Limit: 64 MB
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≤n3;
接下来的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
Original | Transformed |
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
Sample Output
Original | Transformed |
1 1 1 1 1 1 1 27 38 28 32 27
Source
安徽大学第六届程序设计竞赛网络赛
————————————————————忧桑的分割线————————————————————
思路:此题微虐啊。。。看的粗来,此题是BFS(弱菜的我当时却没能看粗来)。需要注意的地方如下:
1.三维 2.多起点 3.访问过的节点标记为它父节点的id
代码如下:
#include <stdio.h> #include <string.h> #include <math.h> #include <stdlib.h> #define LIM nx >= 0 && nx < n && ny >=0 && ny < n && nz >=0 && nz < n typedef struct { int xx, yy, zz; }Node; int dy[6] = {-1,0,1,0,0,0}, dz[6] = {0,1,0,-1,0,0}, dx[6] = {0,0,0,0,-1,1}; int light, n; Node q[100000]; int mat[45][45][45]; int ans[100000]; void bfs(int REAR){ int fron = 0, rear; Node u; rear = REAR; //队尾应该为最后一盏初始亮着的灯 while(fron < rear){ u = q[fron++]; int x = u.xx, y = u.yy, z = u.zz; for(int d = 0; d < 6; d++){ int nx = x + dx[d], ny = y + dy[d], nz = z + dz[d]; if(LIM && !mat[nx][ny][nz]){ q[rear].xx = nx; q[rear].yy = ny; q[rear++].zz = nz; mat[nx][ny][nz] = mat[x][y][z]; //该点被其父节点点亮 } } } return ; } int main(){ int cas, x, y, z, I, id; scanf("%d", &cas); while(cas--){ scanf("%d%d", &n, &light); memset(mat, 0, sizeof(mat)); for(I = 0; I < light; I++){ scanf("%d%d%d", &x, &y, &z); mat[x][y][z] = I+1;//将地图上亮着的点初始化为它的id ans[I] = 0;//要记得初始化ans[] q[I].xx = x; q[I].yy = y; q[I].zz = z;//将一开始亮着的灯压入队列 } ans[I] = 0; bfs(I); for(int i = 0; i < n; i++) for(int j = 0; j < n; j++) for(int k = 0; k < n; k++) ans[mat[i][j][k]]++; //数地图上各id的灯有多少盏 for(id = 1; id < light; id++) printf("%d ", ans[id]); printf("%d\n", ans[id]); } return 0; }
[align=center]
[/align]
相关文章推荐
- AOJ 664彩灯高高挂
- AOJ-AHU-OJ-3 Redraiment的遭遇
- AOJ-AHU-OJ-153 Redraiment的走法
- AOJ-AHU-OJ-36 (POJ-2033) Alphacode
- AOJ-AHU-OJ-675 定位赛
- AOJ-AHU-OJ-4 1、2、3、4、5...
- AOJ-AHU-OJ-6 Hero in maze(拓展)
- AOJ-AHU-OJ-357 YH Triangle
- AOJ-AHU-OJ-661 跨越千山万水只为找到你
- AOJ-AHU-OJ-497 最长起伏子序列
- AOJ-AHU-OJ-5 渊子赛马
- AOJ-AHU-OJ-61 Lake Counting(栈)
- AOJ-AHU-OJ-145 流水线作业调度问题
- AOJ-AHU-OJ-460 Prime Ring Problem(巩固)
- AOJ-AHU-OJ-13(POJ-1056) IMMEDIATE DECODABILITY
- AOJ-AHU-OJ-31 Counting Sheep
- AOJ-AHU-OJ-7 Redraiment猜想
- AOJ-AHU-OJ-528 连通图
- AOJ-AHU-OJ-662 越来越快
- AOJ-AHU-OJ-606 LOL系列之德玛短路