题目如下:

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;
}

转载于:https://www.cnblogs.com/aiwz/p/6154038.html

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. 1091. Acute Stroke (30)-PAT甲级真题(广度优先搜索)

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

  3. 【PTA-A】1091 Acute Stroke (30 分)(BFS、队列)

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

  4. PAT甲级 1091 Acute Stroke(30) (Flood Fill)

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

  5. 1091 Acute Stroke (30 分)【难度: 一般 / bfs】

    https://pintia.cn/problem-sets/994805342720868352/problems/994805375457411072 很常见的题,就是求每一个连通块的大小. #i ...

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

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

  7. 【PAT甲级题解】1091 Acute Stroke (30分) BFS

    本题考BFS应用,题目大意是给出一个三维0,1矩阵,你需要对任意一个元素的上下左右前后进行判断枚举,如果当前元素为1且满足要求,则入队,当前枚举结束后如果该'1'矩阵不小于一个'l'代表的阈值则返回其 ...

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

    三维搜索,按照6个邻接理论,总会有重合的部分区域, 因此根据搜索顺序,先访问到的就是一个区域的[不能较真] #include <bits/stdc++.h> using namespace ...

  9. pat1091. Acute Stroke (30)

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

最新文章

  1. c# winform datagridview改变表头标题的颜色(column header)
  2. The 'Microsoft Jet OLEDB 4.0 Provider' is not registered on the local machine
  3. for-each keyword
  4. 简单粗暴,快速入门Python
  5. AC自动机 学习链接
  6. web项目怎么打包上线_如何打包发布Web Application应用程序
  7. Android Stduio启动模拟器运行项目时做了什么
  8. 《21天学通HTML+CSS+JavaScript Web开发(第7版)》——2.6 Web托管
  9. C# 滑块长度确认 Scrollbar滑块长度问题 水平垂直滚动条滑块高度宽度问题
  10. 数字形式转换,输入0123456789对应输出“一二三四五六七八九”
  11. 可替换MPS MP2451的高压DCDC芯片FS2451助力智能电表设计40V0.5A降压IC
  12. 【MIME协议】base64编码与quoted-printable编码
  13. 【转载】linux修改文件的所有者权限[root权限更改为用户权限]
  14. 问题 E: 天宝便利店
  15. 电路原理计算机,电路原理A卷(07计算机).doc
  16. 有哪些鲜为人知,但是很有意思的网站?
  17. MAC地址存在的意义
  18. matlab一些指令
  19. 实验7 Oracle数据库安全管理
  20. fegin设置header

热门文章

  1. golang网站错误处理
  2. 尚硅谷图解Java数据结构和算法四
  3. golang中strings.ToUpper
  4. wireshark抓包数据学习
  5. MySQl笔记8:把good表中商品名为‘诺基亚xxxx‘的商品,改为‘HTCxxxx‘
  6. 指针数组、数组指针、数组的区别与联系
  7. leetcode 1: 找出两个数相加等于给定数 two sum
  8. Python爬虫入门教程 33-100 《海王》评论数据抓取 scrapy
  9. Delphi下MSMQ(Mircosoft Message Queue)实例(私有队列)
  10. ASP.NET MVC开发中常见异常及解决方案