题目如下:

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)的更多相关文章

  1. 1091 Acute Stroke (30)(30 分)

    One important factor to identify acute stroke (急性脑卒中) is the volume of the stroke core. Given the re ...

  2. PAT (Advanced Level) 1091. Acute Stroke (30)

    BFS求连通块.递归会爆栈. #include<cstdio> #include<cstring> #include<cmath> #include<algo ...

  3. PAT甲题题解-1091. Acute Stroke (30)-BFS

    题意:给定三维数组,0表示正常,1表示有肿瘤块,肿瘤块的区域>=t才算是肿瘤,求所有肿瘤块的体积和 这道题一开始就想到了dfs或者bfs,但当时看数据量挺大的,以为会导致栈溢出,所以并没有立刻写 ...

  4. 【PAT甲级】1091 Acute Stroke (30 分)(BFS)

    题意: 输入四个正整数M,N,K,T(K<=60,M<=1286,N<=128),代表每片的高度和宽度,片数和最小联通块大小.输出一共有多少个单元满足所在联通块大小大于等于T. tr ...

  5. pat1091. Acute Stroke (30)

    1091. Acute Stroke (30) 时间限制 400 ms 内存限制 65536 kB 代码长度限制 16000 B 判题程序 Standard 作者 CHEN, Yue One impo ...

  6. 【PAT】1091 Acute Stroke(30 分)

    1091 Acute Stroke(30 分) One important factor to identify acute stroke (急性脑卒中) is the volume of the s ...

  7. PAT 1091 Acute Stroke [难][bfs]

    1091 Acute Stroke (30 分) One important factor to identify acute stroke (急性脑卒中) is the volume of the ...

  8. PAT 1091. Acute Stroke (bfs)

    One important factor to identify acute stroke (急性脑卒中) is the volume of the stroke core. Given the re ...

  9. 1091 Acute Stroke

    One important factor to identify acute stroke (急性脑卒中) is the volume of the stroke core. Given the re ...

随机推荐

  1. [LSGDOJ 1505]售货员的难题 状压DP

    题目描述 某 乡有n个村庄(1<n<15),有一个售货员,他要到各个村庄去售货,各村庄之间的路程s(0<s<1000)是已知的,且A村 到B村与B村到A村的路大多不同.为了提高 ...

  2. hdu 4533 线段树(问题转化+)

    威威猫系列故事——晒被子 Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 65535/32768 K (Java/Others) Tot ...

  3. POJ 3171 Cleaning Shifts

    Description Farmer John's cows, pampered since birth, have reached new heights of fastidiousness. Th ...

  4. C# 导入excel报错 :不是预期外部表

    错误原因:由于Excel 97-2003的连接格式与Excel 2010 的 不同造成. 解决方案1: 很多人换了2010后,问的最多的问题之一是2003里最经典的ADO中的“provider=Mic ...

  5. 使用PowerPoint

    制作PPT在我们的学习生活中非常常见,PPT也就是演示文稿,平时我们在别人演示和讲解一些内容时都需要用到PPT.PPT可以在电脑上进行放映,看上去就好像一张一张的图片,但与图片不同的是它可以进行编辑. ...

  6. Python作业之三次登陆锁定用户

    作业之三次登陆锁定用户 作业要求如下: 1. 输入用户名和密码 2. 认证成功提示欢迎信息 3. 认证失败三次锁定用户 具体代码如下: 方法1: import os#导入os模块 if os.path ...

  7. 备忘:MySQL中修改表中某列的数据类型、删除外键约束

    -- MySQL中修改表中某列的数据类型 ALTER TABLE [COLUMN] 表名 MODIFY 列名 列定义; -- 删除外键约束 SHOW CREATE TABLE 表名; -- 复制CON ...

  8. sqlserver 按照特定值排序查询结果

    select * from t_ss_student order by case when xm like '林%' then 1 else 2 end asc; 姓林的会排在前面

  9. 40. Combination Sum II(midum, backtrack, 重要)

    Given a collection of candidate numbers (C) and a target number (T), find all unique combinations in ...

  10. SpringMVC之简单的增删改查示例(SSM整合)

    本篇文章主要介绍了SpringMVC之简单的增删改查示例(SSM整合),这个例子是基于SpringMVC+Spring+Mybatis实现的.有兴趣的可以了解一下. 虽然已经在做关于SpringMVC ...