Acute Stroke

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×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×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

题意:
  给出一个三维矩阵,数组元素的取值为0或1.与某一个相邻的元素为其上、下、左、右、前、后这6个方向的邻接元素。另外,若干个相邻的“1”称为一个“块”(不必两两相邻,只要与块中某一个“1”
相邻该“1”就在块中)。而如果某个块中的“1”的个数不低于T个,那么称则个块为“卒中核心区”。现在需要求解所有卒中核心区中的1的个数之和。
 1 #include<cstdio>
2 #include<queue>
3 using namespace std;
4 struct node {
5 int x,y,z; //位置(x,y,z)
6 }Node;
7 int n,m,slice,T; //矩阵为n*m,共有slice层,T为卒中核心区中1的个数的下限
8 int pixel[1290][130][61]; //三维01矩阵
9 bool inq[1290][130][61] = {false}; //记录位置(x,y,z)是否已入过队
10 int X[6] = {0,0,0,0,1,-1}; //增量矩阵
11 int Y[6] = {0,0,1,-1,0,0};
12 int Z[6] = {1,-1,0,0,0,0};
13
14 bool judge(int x,int y,int z) { //判断坐标(x,y,z)是否需要访问
15 //越界返回false
16 if(x>=n || x<0 || y>=m || y<0 || z>=slice || z<0) return false;
17 //若当前位置为0或(x,y,z)已入过队,则返回false
18 if(pixel[x][y][z] == 0 || inq[x][y][z] == true) return false;
19 //以上都不满足,返回true
20 return true;
21 }
22
23 //BFS函数访问位置(x,y,z)所在的块,将该块中所有“1”的inq都设置为true
24 int BFS(int x,int y,int z) {
25 int tot = 0; //计数当前块中1的个数
26 queue<node> Q; //定义队列
27 Node.x = x,Node.y = y,Node.z = z; //结点Node的位置为(x,y,z)
28 Q.push(Node); //将结点Node入队
29 inq[x][y][z] = true; //设置位置(x,y,z)已入过队
30 while(!Q.empty()) {
31 node top = Q.front(); // 取出队首元素
32 Q.pop(); //队首元素出队
33 tot++; //当前块中1的个数加1
34 for(int i=0; i<6; i++) { //循环6次,得到6个增量方向
35 int newX = top.x + X[i];
36 int newY = top.y + Y[i];
37 int newZ = top.z + Z[i];
38 if(judge(newX,newY,newZ)) { //新位置(newX,newY,newZ)需要访问
39 //设置Node的坐标
40 Node.x = newX,Node.y = newY,Node.z = newZ;
41 Q.push(Node); //将结点Node入队
42 inq[newX][newY][newZ] = true; //设置(newX,newY,newZ)已入过队
43 }
44 }
45 }
46 if(tot >= T) return tot; //如果超过阈值,则返回
47 else return 0; //否则不记录该块1的个数
48 }
49
50 int main(){
51 scanf("%d%d%d%d",&n,&m,&slice,&T);
52 for(int z = 0; z<slice; z++) { //注意先枚举切片层号
53 for(int x = 0; x<n; x++) {
54 for(int y = 0; y<m; y++) {
55 scanf("%d",&pixel[x][y][z]);
56 }
57 }
58 }
59 int ans = 0; //记录卒中核心区中1的个数总和
60 for(int z = 0; z<slice; z++) {
61 for(int x=0; x<n; x++) {
62 for(int y = 0; y<m; y++) {
63 //如果当前位置为1,且未被访问,则BFS当前块
64 if(pixel[x][y][z] == 1 && inq[x][y][z] == false) {
65 ans += BFS(x,y,z);
66 }
67 }
68 }
69 }
70 printf("%d\n",ans);
71 return 0;
72 }


PAT A1091——BFS的更多相关文章

  1. PAT A1091 Acute Stroke

    对于坐标平面的bfs模板题~ #include<bits/stdc++.h> using namespace std; ; ][][]={false}; ][][]; int n,m,l, ...

  2. PAT_A1091#Acute Stroke

    Source: PAT A1091 Acute Stroke (30 分) Description: One important factor to identify acute stroke (急性 ...

  3. PAT甲级1091 Acute Stroke【三维bfs】

    题目:https://pintia.cn/problem-sets/994805342720868352/problems/994805375457411072 题意: 求三维的连通块 思路: 简单b ...

  4. PAT甲级1034 Head of a Gang【bfs】

    题目:https://pintia.cn/problem-sets/994805342720868352/problems/994805456881434624 题意: 给定n条记录(注意不是n个人的 ...

  5. PAT A1076 Forwards on Weibo (30 分)——图的bfs

    Weibo is known as the Chinese version of Twitter. One user on Weibo may have many followers, and may ...

  6. PAT A1106 Lowest Price in Supply Chain (25 分)——树的bfs遍历

    A supply chain is a network of retailers(零售商), distributors(经销商), and suppliers(供应商)-- everyone invo ...

  7. PAT A1021 Deepest Root (25 分)——图的BFS,DFS

    A graph which is connected and acyclic can be considered a tree. The hight of the tree depends on th ...

  8. PAT甲题题解-1076. Forwards on Weibo (30)-BFS

    题目大意:给出每个用户id关注的人,和转发最多的层数L,求一个id发了条微博最多会有多少个人转发,每个人只考虑转发一次.用BFS,同时每个节点要记录下所在的层数,由于只能转发一次,所以每个节点要用vi ...

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

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

随机推荐

  1. Three 之 Animation 初印象

    Animation 初印象 动画效果 播放动画需要基本元素 AnimationMixer 一个对象所有动作的管理者 用于场景中特定对象的动画的播放器.一个对象可能有多个动作,Mixer 是用来管理所有 ...

  2. 解决Vite-React项目中js使用jsx语法报错的问题

    背景 在做存量项目接入Vite测试时发现,存量(老)项目中很多是直接在js中书写jsx语法,使用Vite启动时就会抛出一堆问题Failed to parse source. 不嫌麻烦可以跑个脚本批量修 ...

  3. C#开发BIMFACE系列44 服务端API之计算图纸对比差异项来源自哪个图框

    BIMFACE二次开发系列目录     [已更新最新开发文章,点击查看详细] 在前两篇博客<C#开发BIMFACE系列42 服务端API之图纸对比>.<C#开发BIMFACE系列43 ...

  4. 题解 Wide Swap

    题目传送门 题目大意 给出一个长度为 \(n\) 的排列 \(a_{1,2,...,n}\) 以及常数 \(k\),每次可以交换两个数 \(a_i,a_j\) 当且仅当 \(j-i\ge k \tex ...

  5. 对cpu与load的理解及线上问题处理思路

    cpu如何计算 当我们执行top命令的时候,看到里面的值(主要是cpu和load)值是一直在变的,因此有必要简单了解一下Linux系统中cpu的计算方式. cpu分为系统cpu和进程.线程cpu,系统 ...

  6. 微信小程序中路由跳转

    一.是什么 微信小程序拥有web网页和Application共同的特征,我们的页面都不是孤立存在的,而是通过和其他页面进行交互,来共同完成系统的功能 在微信小程序中,每个页面可以看成是一个pageMo ...

  7. Serverless Kubernetes 和 Serverless on Kubernetes 的区别

    什么是 Kubernetes? Kubernetes 是一个可移植的.可扩展的开源平台,用于管理容器化的工作负载和服务,可促进声明式配置和自动化. 什么是 Serverless ? 无服务器是一种云原 ...

  8. 晶振在电路设计时关于负载电容CL大小取值特别需要注意什么?

    在无源晶体的设计中,经常遇到负载电容CL的大小取值.晶振设计与精度的提高.KHz无源晶振的停止.音叉晶体谐振器的精度漂移以及精度和无源晶振在高温下的精度是否等于低温的精度烦忧的问题等. 无源晶体振荡器 ...

  9. 局域网(以太网与IEEE 802.3、IEEE 802.11、)

    文章转自:https://blog.csdn.net/weixin_43914604/article/details/105016637 学习课程:<2019王道考研计算机网络> 学习目的 ...

  10. Vagrant 搭建开发环境实践

    介绍 Development Environments Made Easy -官网标题 vagrant是一个命令行的虚拟机管理程序.用于简化搭建开发环境. vagrant使用ruby语言基于Chef ...