PAT A1091——BFS
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的更多相关文章
- PAT A1091 Acute Stroke
对于坐标平面的bfs模板题~ #include<bits/stdc++.h> using namespace std; ; ][][]={false}; ][][]; int n,m,l, ...
- PAT_A1091#Acute Stroke
Source: PAT A1091 Acute Stroke (30 分) Description: One important factor to identify acute stroke (急性 ...
- PAT甲级1091 Acute Stroke【三维bfs】
题目:https://pintia.cn/problem-sets/994805342720868352/problems/994805375457411072 题意: 求三维的连通块 思路: 简单b ...
- PAT甲级1034 Head of a Gang【bfs】
题目:https://pintia.cn/problem-sets/994805342720868352/problems/994805456881434624 题意: 给定n条记录(注意不是n个人的 ...
- 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 ...
- PAT A1106 Lowest Price in Supply Chain (25 分)——树的bfs遍历
A supply chain is a network of retailers(零售商), distributors(经销商), and suppliers(供应商)-- everyone invo ...
- 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 ...
- PAT甲题题解-1076. Forwards on Weibo (30)-BFS
题目大意:给出每个用户id关注的人,和转发最多的层数L,求一个id发了条微博最多会有多少个人转发,每个人只考虑转发一次.用BFS,同时每个节点要记录下所在的层数,由于只能转发一次,所以每个节点要用vi ...
- PAT甲题题解-1091. Acute Stroke (30)-BFS
题意:给定三维数组,0表示正常,1表示有肿瘤块,肿瘤块的区域>=t才算是肿瘤,求所有肿瘤块的体积和 这道题一开始就想到了dfs或者bfs,但当时看数据量挺大的,以为会导致栈溢出,所以并没有立刻写 ...
随机推荐
- HTML元素的三种类型及其转换
HTML元素的三大类型 1.块元素 可以设置宽高大小,默认宽度为100%,并且独占一行. 例如:p ul li h1~h6 div form table 2.内联(行内)元素 无法设置宽高,元素大小随 ...
- 基于PaddleOCR实现AI发票识别的Asp.net Core应用
简要介绍 用户批量上传需要识别的照片,上传成功后,系统会启动Hangfire后台Job开始调用PaddleOCR服务返回结果,这个过程有点类似微服务的架构模型. PaddleOCR PaddleOCR ...
- LightningChart XY功能中的常见问题
LightningChart XY功能中的常见问题 XY 是LightningChart 的重要功能之一,也是被用户使用最广泛的.用户经常对这个功能有着这样那样的疑问,现在将一些常用问题汇总了一下,希 ...
- .Net Core with 微服务 - 使用 AgileDT 快速实现基于可靠消息的分布式事务
前面对于分布式事务也讲了好几篇了(可靠消息最终一致性 分布式事务 - TCC 分布式事务 - 2PC.3PC),但是还没有实战过.那么本篇我们就来演示下如何在 .NET 环境下实现一个基于可靠消息的分 ...
- change or reset WSL password
change or reset WSL password To change or reset your password, open the Linux distribution and enter ...
- 笨方法学python中执行argv提示ValueError: not enough values to unpack (expected 4, got 1)
解决方法:选择Terminal中输入执行ex13.py 1 2 3 执行结果如下图
- Java:容器类线程不安全
Java:容器类线程不安全 本笔记是根据bilibili上 尚硅谷 的课程 Java大厂面试题第二季 而做的笔记 1. Collection 线程不安全的举例 前言 1.当我们执行下面语句的时候,底层 ...
- 服务器端的GPU使用
服务器端的GPU使用 查看GPU信息 查看nvidia GPU信息: # 输入指令 lspci | grep -i nvidia # 结果如下: # 04:00.0 3D controller: NV ...
- [对对子队]会议记录4.11(Scrum Meeting 2)
今天已完成的工作 何瑞 工作内容:完成指令的衔接:完成合成指南界面的制作:初步实现成本系统 相关issue:实现用户指令编辑系统的逻辑 马嘉 工作内容:完成游戏内暂停界面 相关issu ...
- OO_JAVA_电梯运行模拟_单元总结
电梯运行模拟--三次作业总结 目录 电梯运行模拟--三次作业总结 总体遵循的设计思路 逻辑解耦 电梯与调度器解耦 楼层信息的存储和变更与电梯.调度器解耦 调度器运行流程解耦 第一次电梯,蠢笨串行先到先 ...