原题链接
- 题目分析:
给定一个三维数组,0表示正常1表示有肿瘤,肿瘤块的大小大于等于t才算作是肿瘤,计算所有满足肿瘤块的大小。BFS遍历三维数组(图)。需要注意的是沿x,y,z方向移动的方法,这里用三个数组表示。
int fx[6] = { 1,0,0,-1,0,0 };
int fy[6] = { 0,1,0,0,-1,0 };
int fz[6] = { 0,0,1,0,0,-1 };
#include <iostream>
#include <queue>
using namespace std;
#pragma warning(disable:4996)
typedef struct
{
int x, y, z;
}nodes;
int att[1287][129][61];
bool visit[1287][129][61];
int m, n, l, t;
bool judge(int x, int y, int z)
{
if (x<0 || x>=m || y<0 || y>=n || z<0 || z>= l)return false;
if (att[x][y][z] == 0 || visit[x][y][z] == 1)return false;
return true;
}
int fx[6] = { 1,0,0,-1,0,0 };
int fy[6] = { 0,1,0,0,-1,0 };
int fz[6] = { 0,0,1,0,0,-1 };
int bfs(int x, int y, int z)
{
int inc = 0;
int tempx, tempy, tempz;
nodes p;
p.x = x; p.y = y; p.z = z;
queue<nodes> q;
q.push(p);
nodes temp;
visit[x][y][z] = 1;
while (!q.empty())
{
temp = q.front();
q.pop();
++inc;
for (int i = 0; i < 6; ++i)
{
tempx = temp.x + fx[i];
tempy = temp.y + fy[i];
tempz = temp.z + fz[i];
if (judge(tempx, tempy, tempz))
{
visit[tempx][tempy][tempz] = 1;
p.x = tempx; p.y = tempy; p.z = tempz;
q.push(p);
}
}
}
if (inc >= t)
return inc;
else
return 0;
}
int main()
{
scanf("%d %d %d %d", &m, &n, &l, &t);
int i, j, k;
for (k = 0; k < l; ++k)
for (i = 0; i < m; ++i)
for (j = 0; j < n; ++j)
scanf("%d", &att[i][j][k]);
int result = 0;
for (k = 0; k < l; ++k)
for (i = 0; i < m; ++i)
for (j = 0; j < n; ++j)
if(att[i][j][k]==1&&visit[i][j][k]==0)
result += bfs(i, j, k);
printf("%d", result);
system("pause");
return 0;
}