题目翻译如下:
急性脑卒中
识别急性脑卒中的重要手段之一是根据中风核心的体积来判定。题目给出一个定义于每个MRI切片的核心区域分析的图像结果,你需要计算出中风核心的体积。
输入格式:
每个输入文件包含一个测试案例。在每个测试案例中,第一行给出四个正整数:M,N,L和T,其中M和N是每个切片的大小(例如:一个切片的像素为一块M*N的矩形,最大分辨率为1280*128);L(<=60)是一个脑的切片总数;T是整数阈值(例如:如果一个相连的核心体积小于T,那么这个核心就不应被计数)。
接着给出L个切片。每个切片由0或1表示的M*N的矩形组成,其中1代表该像素点中风,0代表该点正常。由于一个切片的厚度是常数,我们只需要统计1的数量来获得体积大小。然而脑中可能是一些分离的核心区域,但是我们只统计其中体积不小于T的中风核心。两个像素点相连既是属于了一个区域(核心话语),如果它们共用一面,如图中所示的6个像素点是被蓝色像素相连的。
输出格式:
对于每一个案例,在一行中输出所有的中风核心体积总大小。
#include
#include
using namespace std;
int m, n, l, t, TOL = 0;
bool aa[60][1286][128] = { 0 }, bb[60][1286][128] = { 0 };
queueql, qm, qn;
void bfs(int i, int j, int k);
void pus(int i, int j, int k) {
ql.push(i), qm.push(j), qn.push(k);
}
void get(int *ii, int *jj, int *kk) {
*ii = ql.front(), *jj = qm.front(), *kk = qn.front();
ql.pop(), qm.pop(), qn.pop();
}
void opt(int ii, int jj, int kk, int *tol);
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, val; k < n; k++)
{
scanf("%d", &val);
val ? aa[i][j][k] = true : false;
}
for (int i = 0; i < l; i++)
for (int j = 0; j < m; j++)
for (int k = 0; k < n; k++)
if (aa[i][j][k] && !bb[i][j][k])
{
bb[i][j][k] = true;
pus(i, j, k);
bfs(i, j, k);
}
printf("%d", TOL);
return 0;
}
void bfs(int i, int j, int k)
{
int ii, jj, kk, tol = 1;
while (ql.size())
{
get(&ii, &jj, &kk);
opt(ii - 1, jj, kk, &tol), opt(ii + 1, jj, kk, &tol);
opt(ii, jj - 1, kk, &tol), opt(ii, jj + 1, kk, &tol);
opt(ii, jj, kk - 1, &tol), opt(ii, jj, kk + 1, &tol);
}
if (tol >= t) TOL += tol;
return;
}
void opt(int ii, int jj, int kk, int *tol)
{
if (ii >= 0 && jj >= 0 && kk >= 0
&& ii < l && jj < m && kk < n
&& aa[ii][jj][kk] && !bb[ii][jj][kk])
{
bb[ii][jj][kk] = true;
pus(ii, jj, kk); (*tol)++;
}
return;
}
#include
#include
using namespace std;
int m, n, l, t, TOL = 0, z[6] = { 1,-1,0,0,0,0 },
x[6] = { 0,0,1,-1,0,0 }, y[6] = { 0,0,0,0,1,-1 };
bool aa[60][1286][128] = { 0 }, bb[60][1286][128] = { 0 };
struct node {
int x, y, z;
};
queueqq;
void bfs(int i, int j, int k);
bool jud(int tz, int tx, int ty)
{
if (tz < 0 || tx < 0 || ty < 0 || tz >= l || tx >= m || ty >= n)
return false;
if (!aa[tz][tx][ty] || bb[tz][tx][ty])
return false;
return 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, val; k < n; k++)
{
scanf("%d", &val);
val ? aa[i][j][k] = true : false;
}
for (int i = 0; i < l; i++)
for (int j = 0; j < m; j++)
for (int k = 0; k < n; k++)
if (aa[i][j][k] && !bb[i][j][k])
{
bb[i][j][k] = true;
bfs(i, j, k);
}
printf("%d", TOL);
return 0;
}
void bfs(int i, int j, int k)
{
int tol = 1;
node temp;
temp.z = i, temp.x = j, temp.y = k;
qq.push(temp);
while (qq.size())
{
node top = qq.front(); qq.pop();
for (int i = 0; i < 6; i++)
{
int tz = top.z + z[i];
int tx = top.x + x[i];
int ty = top.y + y[i];
if (jud(tz, tx, ty))
{
bb[tz][tx][ty] = true; tol++;
temp.z = tz, temp.x = tx, temp.y = ty;
qq.push(temp);
}
}
}
if (tol >= t) TOL += tol;
return;
}