PAT 1091 Acute Stroke

2023-10-29 08:20
文章标签 pat stroke 1091 acute

本文主要是介绍PAT 1091 Acute Stroke,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

                                                                                PAT 1091 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:

 

Sample Output:

26

 

解题思路:

1、看完题目,感觉人都快奔溃了,题目这啥意思啊,理解不清楚题意,因此看了算法笔记的翻译,大概理解到该题就是在书上例题的基础上,扩充为了3维,求“1”的块。

2、依据例题的思路,自己独立将该题代码写出来了,但以为求的是块的个数,所以算出的结果不是最终答案,题目要求得是所有卒中核心区中1的个数总和,而不是求卒中核心区的个数

 

注意点:

1、理解不同维数的增量数组的写法,刚开始写这种BFS题目时,对这个的由来很困惑,对PAT的这个增量数组开始也非常疑惑,但其实它理解起来是很简单的,二维时该数组每个index分别表示的是,上、下、左、右。三维时该数组每个index分别表示的是,前、后、上、下、左、右。例如在X[]中的左右上写上1、-1就表示在X轴的左右进行偏移。

二维是:

int X[]={0,0,1,-1}(左右);

int Y[]={1,-1,0,0}(上下);

三维是

int X[] = {0, 0, 0, 0, 1, -1};//左右

int Y[] = {0, 0, 1, -1, 0, 0}; //上下

int Z[] = {1, -1, 0, 0, 0, 0}; //前后

 

 

 

代码:

#include<iostream>#include<queue>using namespace std;const int maxN = 1290, maxM = 130, maxL = 61;int Marx[maxL][maxN][maxM];//3维矩阵,用来存储0,1矩阵bool inq[maxL][maxN][maxM]={false};//是否入队int X[] = {0, 0, 0, 0, 1, -1};//左右int Y[] = {0, 0, 1, -1, 0, 0}; //上下int Z[] = {1, -1, 0, 0, 0, 0}; //前后int m, n, l, t;int count = 0;//统计1的个数struct Node{int x, y, z;}node;bool judge(int x,int y, int z){if(x<0||x>=m||y<0||y>=n||z<0||z>=l)return false;//越界if(inq[z][x][y]||Marx[z][x][y]==0)return false;//已入队或该点为0return true;}void BFS(int z,int x,int y){queue<Node> qN;node.x = x;node.y = y;node.z = z;qN.push(node);inq[z][x][y] = true;//设置队首元素已入队while (!qN.empty()){Node top = qN.front();//取队首结点qN.pop();//弹出队首结点for (int i = 0; i < 6; i++)//访问队首元素{int newX = top.x + X[i];int newY = top.y + Y[i];int newZ = top.z + Z[i];if (judge(newX,newY,newZ)){count++;//1的数目增加node.x = newX;node.y = newY;node.z = newZ;qN.push(node);//入队inq[newZ][newX][newY] = true;//该点已入队}}}}int main(){scanf("%d%d%d%d", &m, &n, &l, &t);for (int i = 0; i < l; i++){for (int j = 0; j < m; j++){for (int k = 0; k < n; k++){scanf("%d", &Marx[i][j][k]);//z,x,y的顺序}}}//求解int ans = 0;for (int i = 0; i < l; i++){for (int j = 0; j < m; j++){for (int k = 0; k < n; k++){if (inq[i][j][k] == false && Marx[i][j][k]==1){count = 1;BFS(i, j, k);if(count>=t){//不少于t个则为一个块ans+=count;}}}}}cout << ans<<endl;system("pause");return 0;}

 

这篇关于PAT 1091 Acute Stroke的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/299428

相关文章

PAT甲级-1044 Shopping in Mars

题目   题目大意 一串项链上有n个钻石,输入给出每个钻石的价格。用m元买一个连续的项链子串(子串长度可为1),如果不能恰好花掉m元,就要找到最小的大于m的子串,如果有重复就输出多个,按递增顺序输出子串的前端和后端索引。 原来的思路 取连续的子串使和恰等于m,没有恰等于就找最小的大于。可以将子串依次累加,使得每个位置都是起始位置到该位置的序列和,整个数组显递增顺序,就可以用右边减左边

PAT (Advanced Level) Practice——1011,1012

1011:  链接: 1011 World Cup Betting - PAT (Advanced Level) Practice (pintia.cn) 题意及解题思路: 简单来说就是给你3行数字,每一行都是按照W,T,L的顺序给出相应的赔率。我们需要找到每一行的W,T,L当中最大的一个数,累乘的结果再乘以0.65,按照例子写出表达式即可。 同时还需要记录每一次选择的是W,T还是L

PAT (Advanced Level) Practice

1001:  题目大意: 计算 a+b 的结果,并以标准格式输出——即每三个数字一组,组之间用逗号分隔(如果数字少于四位,则不需要逗号分隔)  解析: 我们知道相加右正有负,对于样例来说 Sample Input: -1000000 9 Sample Output: -999,991 如果是从左往右,算上负号的话输出应该是-99,999,1 从右往左:-,999,991离正确

1050 String Subtraction——PAT甲级

Given two strings S1​ and S2​, S=S1​−S2​ is defined to be the remaining string after taking all the characters in S2​ from S1​. Your task is simply to calculate S1​−S2​ for any given strings. However,

1105 链表合并——PAT乙级

给定两个单链表 L1​=a1​→a2​→⋯→an−1​→an​ 和 L2​=b1​→b2​→⋯→bm−1​→bm​。如果 n≥2m,你的任务是将比较短的那个链表逆序,然后将之并入比较长的那个链表,得到一个形如 a1​→a2​→bm​→a3​→a4​→bm−1​⋯ 的结果。例如给定两个链表分别为 6→7 和 1→2→3→4→5,你应该输出 1→2→7→3→4→6→5。 输入格式: 输入首先在第一

1110 区块反转——PAT乙级

给定一个单链表 L,我们将每 K 个结点看成一个区块(链表最后若不足 K 个结点,也看成一个区块),请编写程序将 L 中所有区块的链接反转。例如:给定 L 为 1→2→3→4→5→6→7→8,K 为 3,则输出应该为 7→8→4→5→6→1→2→3。 输入格式: 每个输入包含 1 个测试用例。每个测试用例第 1 行给出第 1 个结点的地址、结点总个数正整数 N (≤105)、以及正整数 K (

PAT-1039 到底买不买(20)(字符串的使用)

题目描述 小红想买些珠子做一串自己喜欢的珠串。卖珠子的摊主有很多串五颜六色的珠串,但是不肯把任何一串拆散了卖。于是小红要你帮忙判断一下,某串珠子里是否包含了全部自己想要的珠子?如果是,那么告诉她有多少多余的珠子;如果不是,那么告诉她缺了多少珠子。为方便起见,我们用[0-9]、[a-z]、[A-Z]范围内的字符来表示颜色。例如,YrR8RrY是小红想做的珠串;那么ppRYYGrrYBR2258可以

PAT-1028

题目描述 某城镇进行人口普查,得到了全体居民的生日。现请你写个程序,找出镇上最年长和最年轻的人。这里确保每个输入的日期都是合法的,但不一定是合理的——假设已知镇上没有超过200岁的老人,而今天是2014年9月6日,所以超过200岁的生日和未出生的生日都是不合理的,应该被过滤掉。 输入描述: 输入在第一行给出正整数N,取值在(0, 105];随后N行,每行给出1个人的姓名(由不超过5个

每日一题——Python代码实现PAT乙级1048 数字加密(举一反三+思想解读+逐步优化)五千字好文

一个认为一切根源都是“自己不够强”的INTJ 个人主页:用哲学编程-CSDN博客专栏:每日一题——举一反三Python编程学习Python内置函数 Python-3.12.0文档解读 目录 初次尝试  再次尝试 代码点评 代码结构 时间复杂度 空间复杂度 优化建议 我要更强 优化建议 完整代码及注释 时间复杂度和空间复杂度分析 进一步优化 哲学和编程思想 模块化

PAT-L1-020 帅到没朋友

L1-020 帅到没朋友 (20 分) 当芸芸众生忙着在朋友圈中发照片的时候,总有一些人因为太帅而没有朋友。本题就要求你找出那些帅到没有朋友的人。 输入格式: 输入第一行给出一个正整数N(≤100),是已知朋友圈的个数;随后N行,每行首先给出一个正整数K(≤1000),为朋友圈中的人数,然后列出一个朋友圈内的所有人——为方便起见,每人对应一个ID号,为5位数字(从00000到99999),I