1091. Acute Stroke (30)
2015-08-28 14:30
344 查看
题目如下:
One important factor to identify acute stroke (急性脑卒中) is the volume of the stroke core. Given the results of image analysis in which the core regions are identified in each MRI slice, your job is to calculate the volume of the stroke core.
Input Specification:
Each input file contains one test case. For each case, the first line contains 4 positive integers: M, N, L and T, where M and N are the sizes of each slice (i.e. pixels of a slice are in an M by N matrix, and the maximum resolution is 1286 by 128); L (<=60)
is the number of slices of a brain; and T is the integer threshold (i.e. if the volume of a connected core is less than T, then that core must not be counted).
Then L slices are given. Each slice is represented by an M by N matrix of 0's and 1's, where 1 represents a pixel of stroke, and 0 means normal. Since the thickness of a slice is a constant, we only have to count the number of 1's to obtain the volume. However,
there might be several separated core regions in a brain, and only those with their volumes no less than T are counted. Two pixels are "connected" and hence belong to the same region if they share a common side, as shown by Figure 1 where all the 6 red pixels
are connected to the blue one.
![](http://www.patest.cn/upload/g0_nf8qpnrr0f1.jpg)
Figure 1
Output Specification:
For each case, output in a line the total volume of the stroke core.
Sample Input:
Sample Output:
这道题的叙述相当的费解,而且图有些抽象,我读了两次都没有读懂,后来看了Uncle_Sugar的叙述和解法才明白了题意,其解法简洁、高效、易懂,下面进行介绍。
题目的本质就是对一个三维数组中1的连通区域中所有1进行计数。因为是三维坐标,因此对1计数不再是简单的四个方向,而是六个,分别是前后左右上下,也就是图中给出的六个红色。个人认为这张图过于抽象,说白了就是进行三维广度或者深度搜索,只不过邻接点的判断是通过六个方向是否为1来确定的。
Uncle_Sugar的算法巧妙地给出了六个方向的BFS实现,对于某个位置(x,y,z),我们先判断(x+1,y,z),接着判断(x-1,y,z),然后是(x,y+1,z)...以此类推,他巧妙的利用三个一维数组实现了用一个循环实现六个方向的遍历,然后判断是否是合法范围,是则计数,最后即可得到1的总数。
下面是Uncle_Sugar的代码:
One important factor to identify acute stroke (急性脑卒中) is the volume of the stroke core. Given the results of image analysis in which the core regions are identified in each MRI slice, your job is to calculate the volume of the stroke core.
Input Specification:
Each input file contains one test case. For each case, the first line contains 4 positive integers: M, N, L and T, where M and N are the sizes of each slice (i.e. pixels of a slice are in an M by N matrix, and the maximum resolution is 1286 by 128); L (<=60)
is the number of slices of a brain; and T is the integer threshold (i.e. if the volume of a connected core is less than T, then that core must not be counted).
Then L slices are given. Each slice is represented by an M by N matrix of 0's and 1's, where 1 represents a pixel of stroke, and 0 means normal. Since the thickness of a slice is a constant, we only have to count the number of 1's to obtain the volume. However,
there might be several separated core regions in a brain, and only those with their volumes no less than T are counted. Two pixels are "connected" and hence belong to the same region if they share a common side, as shown by Figure 1 where all the 6 red pixels
are connected to the blue one.
![](http://www.patest.cn/upload/g0_nf8qpnrr0f1.jpg)
Figure 1
Output Specification:
For each case, output in a line the total volume of the stroke core.
Sample Input:
3 4 5 2 1 1 1 1 1 1 1 1 1 1 1 1 0 0 1 1 0 0 1 1 0 0 1 1 1 0 1 1 0 1 0 0 0 0 0 0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 1 0 0 0
Sample Output:
26
这道题的叙述相当的费解,而且图有些抽象,我读了两次都没有读懂,后来看了Uncle_Sugar的叙述和解法才明白了题意,其解法简洁、高效、易懂,下面进行介绍。
题目的本质就是对一个三维数组中1的连通区域中所有1进行计数。因为是三维坐标,因此对1计数不再是简单的四个方向,而是六个,分别是前后左右上下,也就是图中给出的六个红色。个人认为这张图过于抽象,说白了就是进行三维广度或者深度搜索,只不过邻接点的判断是通过六个方向是否为1来确定的。
Uncle_Sugar的算法巧妙地给出了六个方向的BFS实现,对于某个位置(x,y,z),我们先判断(x+1,y,z),接着判断(x-1,y,z),然后是(x,y+1,z)...以此类推,他巧妙的利用三个一维数组实现了用一个循环实现六个方向的遍历,然后判断是否是合法范围,是则计数,最后即可得到1的总数。
下面是Uncle_Sugar的代码:
# include <cstdio> # include <queue> using std::queue; int map[1286][128][60]; struct loca { int x,y,z; loca(int _x,int _y,int _z):x(_x),y(_y),z(_z){} }; int m,n,l,t; int dx[6] = {1,-1,0,0,0,0}; int dy[6] = {0,0,1,-1,0,0}; int dz[6] = {0,0,0,0,1,-1}; int ans = 0; int InRange(int x,int y,int z) { return x < m && x >=0 && y < n&&y >= 0 && z < l && z >= 0; } void bfs(int x,int y,int z) { int ret = 0; queue<loca> que; que.push(loca(x,y,z)); map[x][y][z] = 0;ret++; while (!que.empty()) { loca tp = que.front();que.pop(); x = tp.x; y = tp.y; z = tp.z; for (int i=0;i<6;i++) { int nx = x + dx[i]; int ny = y + dy[i]; int nz = z + dz[i]; if (InRange(nx,ny,nz) && map[nx][ny][nz] == 1) { map[nx][ny][nz] = 0;ret++; que.push(loca(nx,ny,nz)); } } } if (ret>=t) ans += ret; } int main() { scanf("%d%d%d%d",&m,&n,&l,&t); for (int k=0;k<l;k++) for (int i=0;i<m;i++) for (int j=0;j<n;j++) scanf("%d",&map[i][j][k]); for (int k=0;k<l;k++) for (int i=0;i<m;i++) for (int j=0;j<n;j++) if (map[i][j][k]==1) bfs(i,j,k); printf("%d\n",ans); return 0; }
相关文章推荐
- 财务帐与后勤不一致情况
- 字符串转换成数字
- python在数据库中的应用
- 1091. Acute Stroke (30)
- oracle 解析json格式
- ionic结合HTML5实现打电话功能
- Eclipse 自动格式化问题
- Android模拟器访问本地tomcat下web应用
- 关于Java @Override 报错
- 【信息安全】ECC加密算法入门介绍
- Linux学习笔记-----Linux服务管理------RPM服务管理-----独立服务管理
- ios 富文本
- sql sever之增删改查
- Hibernate关联之一对一外键单向关联
- 【iOS】有用资源
- MySQL 事件
- Mars Chen Android开发教学视频中XML代码实现的总结
- UINavigation_Bar
- Kalman
- android 获取内置Sdcard 外置Sdcard内存卡 除了奇葩机型 都能获取到