PAT (Advanced Level) Practice_1091 Acute Stroke(30分)翻訳を含む
急性脳卒中は急性脳卒中を識別する重要な手段の一つは脳卒中の核心の体積によって判定することである.タイトルは各MRIスライスのコア領域解析に定義された画像結果を与え,脳卒中コアの体積を計算する必要がある.入力形式:入力ファイルごとにテストケースが含まれます.各試験例において、第1行は4つの正の整数を与える:M,N,LおよびT、ここでMおよびNは各スライスのサイズである(例えば、1つのスライスの画素はM*Nの矩形であり、最大解像度は1280*128である).L(<=60)は脳のスライス総数である.Tは整数閾値である(例えば、接続されたコア体積がTより小さい場合、このコアはカウントされるべきではない).次にL個のスライスを与える.各スライスは、0または1で表されるM*Nの矩形で構成され、1は画素点脳卒中を表し、0は点正常を表す.スライスの厚さが定数であるため,体積サイズを得るには1の数を統計する必要がある.しかし、脳の中にはいくつかの分離されたコア領域があるかもしれないが、体積がTより小さくない脳卒中コアだけを統計した.2つの画素点が接続されているのは、1つの領域(コア言語)に属している場合であり、それらが1つの面を共有している場合、図に示すように6つの画素点が青色画素に接続されている.出力フォーマット:各ケースについて、すべての中風コアボリュームの合計サイズを1行に出力します.
#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;
}