PAT 1091 Acute Stroke

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

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

 

下面会有中文解释     下面会有中文解释      下面会有中文解释

                                                                       1091 Acute Stroke (30分)

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.

figstroke.jpg

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

题目大意:

判断一个人是否得了急性脑卒中的重要方式就是看他中风核心区的体积,我们建立一个图像模型,将模型分片(分层),分为L(<=60)片,每片的像素大小是 M x N 大小(长x宽)(M<=1286,N<=128), 像素点(值为1)以及它的相邻像素点(值也为1)以及它的相邻像素点的相邻像素点(值为1)以及继续相邻的那些像素点的个数如果超过了T(阀值),则该区域为中风核心区,我们需要计算在内。

有一个三维的图像像素模型, 模型中每个像素点的值为1或者0,每个像素点的相邻像素点包括上下左右前后六个方向的像素点,也就是说除了边缘上的像素点之外每个像素点有六个相邻像素点。

若干个相邻的“1”称为一个“块”(不必两两相邻,只要与块中某一个“1”相邻,该“I”就在块中)。而如果某个块中的“1”的个数不
低于T个,那么称这个块为“卒中核心区"。现在需要求解所有卒中核心区中的1的个数之和。

输入:

四个整数:N,M,L,T

接下来有L个片,每个片有N行M列。

输出:

卒中核心区的体积 (卒中核心区中的1的个数之和)

#include<iostream>
#include<algorithm>
#include<string>
#include<vector>
#include<queue>
#include<map>
#include<unordered_map>
#include<set>
#include<sstream>
using namespace std;
const int MAXN = 1290; 
const int MAXM = 130;
const int MAXL = 60;struct Node{int x;int y;int z;Node(int x,int y,int z){this->x = x;this->y = y;this->z = z;}
};
//矩阵为n*m型,共有l层,某个块中1的个数超过t才算是卒中核心区。 
int n,m,l,t; 
int pixels[MAXN][MAXM][MAXL]; //像素点分布 
bool vis[MAXN][MAXM][MAXL] = {false}; //(x,y,z)像素点是否已访问过 
//上 下  左  右  前  后 中x,y,z改变的值 
int xc[6] = {0,0 ,0 ,0,1,-1};
int yc[6] = {0,0 ,-1,1,0,0};
int zc[6] = {1,-1,0 ,0,0,0}; 
queue<Node> que;//判断某个像素点是否超出范围 
bool judge(int x,int y,int z){if(x<0||x>=n||y<0||y>=m||z<0||z>=l){return false;	}	return true; 
}int BFS(int x,int y,int z){int num = 0; //一次BFS找到的stroke core(卒中核心区)的体积。 /***注意点:vis表示的是已访问,而不是已进栈,**就算程序过程中这个节点又被弹出栈,它的vis值也仍然为true。 **/if(!vis[x][y][z] && pixels[x][y][z]==1){que.push(Node(x,y,z));vis[x][y][z] = true;num++;}while(!que.empty()){/*** 误区:这个地方不能写成Node &node** 也就是不能用引用,否则会有两个样例通过不了** 我也很郁闷。。。 */Node node = que.front();que.pop();for(int i=0;i<6;i++){int nx = node.x + xc[i];int ny = node.y + yc[i];int nz = node.z + zc[i];if(judge(nx,ny,nz) && !vis[nx][ny][nz] && pixels[nx][ny][nz]==1){que.push(Node(nx,ny,nz));vis[nx][ny][nz] = true;num++;}}}if(num < t){num = 0;}return num;
}int main(){ cin>>n>>m>>l>>t;for(int z=0;z<l;z++){for(int x=0;x<n;x++){for(int y=0;y<m;y++){cin>>pixels[x][y][z];}}} int sum = 0;for(int z=0;z<l;z++){for(int x=0;x<n;x++){for(int y=0;y<m;y++){//BFS的功能: //看一下(x,y,z)这个像素点是不是卒中核心区//如果是的话返回它的体积(值为1的像素点的个数) sum += BFS(x,y,z);}}} cout<<sum<<endl;return 0; 
} 

 

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



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

相关文章

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