PAT (Advanced Level) Practice_1091 Acute Stroke (30 分)_含翻译

  • 题目地址
  • 题目解析:现在发现读题确实是一个值得认真考虑的问题!其次这道题目我将给出两种解答,只是上下左右位移方式的操作变化。(感谢LiuChuo)

  • 题目翻译如下:

    急性脑卒中

    识别急性脑卒中的重要手段之一是根据中风核心的体积来判定。题目给出一个定义于每个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;
}

 

你可能感兴趣的:(PAT,(Advanced,Level),Practice)