1091. Acute Stroke (30)
题目如下:
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.

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;
}
1091. Acute Stroke (30)的更多相关文章
- 1091 Acute Stroke (30)(30 分)
		
One important factor to identify acute stroke (急性脑卒中) is the volume of the stroke core. Given the re ...
 - PAT (Advanced Level) 1091. Acute Stroke (30)
		
BFS求连通块.递归会爆栈. #include<cstdio> #include<cstring> #include<cmath> #include<algo ...
 - PAT甲题题解-1091. Acute Stroke (30)-BFS
		
题意:给定三维数组,0表示正常,1表示有肿瘤块,肿瘤块的区域>=t才算是肿瘤,求所有肿瘤块的体积和 这道题一开始就想到了dfs或者bfs,但当时看数据量挺大的,以为会导致栈溢出,所以并没有立刻写 ...
 - 【PAT甲级】1091 Acute Stroke (30 分)(BFS)
		
题意: 输入四个正整数M,N,K,T(K<=60,M<=1286,N<=128),代表每片的高度和宽度,片数和最小联通块大小.输出一共有多少个单元满足所在联通块大小大于等于T. tr ...
 - pat1091. Acute Stroke (30)
		
1091. Acute Stroke (30) 时间限制 400 ms 内存限制 65536 kB 代码长度限制 16000 B 判题程序 Standard 作者 CHEN, Yue One impo ...
 - 【PAT】1091 Acute Stroke(30 分)
		
1091 Acute Stroke(30 分) One important factor to identify acute stroke (急性脑卒中) is the volume of the s ...
 - PAT 1091 Acute Stroke [难][bfs]
		
1091 Acute Stroke (30 分) One important factor to identify acute stroke (急性脑卒中) is the volume of the ...
 - PAT 1091. Acute Stroke (bfs)
		
One important factor to identify acute stroke (急性脑卒中) is the volume of the stroke core. Given the re ...
 - 1091 Acute Stroke
		
One important factor to identify acute stroke (急性脑卒中) is the volume of the stroke core. Given the re ...
 
随机推荐
- hdu 4352 数位dp + 状态压缩
			
XHXJ's LIS Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total ...
 - 【Rain in ACStar HDU-3340】
			
·你正从AC星球返回,天又下起凸包雨,只好到线段树下躲雨. ·英文题,述大意: 一个竖直平面的美丽天空,会下凸包雨.凸包雨指的是边数为3~6的多边形,并且每一个它都遵守一个神奇定律,那就是 ...
 - Frame buffer分析 - fbmem.c【转】
			
转自:http://www.cnblogs.com/armlinux/archive/2012/03/01/2396753.html 45 struct fb_info *registered_fb[ ...
 - udacity/CarND-Path-Planning-Project 工程详细配置过程——吐血整理
			
本人原创,转载请注明地址 学习udacity/CarND-Path-Planning-Project 工程过程 1.首先登陆 jeremy-shannon/CarND-Path-Planning-Pr ...
 - Linux下解决无法远程连接数据库问题
			
起因 今天在ubuntu16.04环境下通过mysql workbench访问远程数据库时,发现无法连接问题,解决思路及方法记录如下,不足之处,请多指教. 问题 通过workbench输入密码访问时报 ...
 - java 左移 右移
			
public class test{ public static void main(String[] args) { int m = 9; int n = m >> 3; int p = ...
 - 数据结构之Trie树
			
1. 概述 Trie树,又称字典树,单词查找树或者前缀树,是一种用于快速检索的多叉树结构,如英文字母的字典树是一个26叉树,数字的字典树是一个10叉树. Trie一词来自retrieve,发音为/tr ...
 - 解决Mysql数据库拒绝远程连接和忘记密码的问题
			
解决数据库忘记密码的问题 ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: YES) 编辑m ...
 - 下拉框多级联动辅助js,优化您的下拉框
			
function IniteSelect(options) { $("body").IniteSelect(options) } (function ($) { $.fn.Init ...
 - django之数据库orm
			
一.数据库的配置 1 django默认支持sqlite,mysql, oracle,postgresql数据库. <1>sqlite django默认使用sqlite的数据库,默认自带sq ...