PAT甲级——1004.Acute Stroke

原题链接

  • 题目分析:
    给定一个三维数组,0表示正常1表示有肿瘤,肿瘤块的大小大于等于t才算作是肿瘤,计算所有满足肿瘤块的大小。BFS遍历三维数组(图)。需要注意的是沿x,y,z方向移动的方法,这里用三个数组表示。
//题目原意是沿上下左右前后查找值为1的数,六个方向查找完,统计1的个数inc,
//inc大于等于t即为肿瘤块。
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 };
  • C源码
#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)//用于判断是否应该访问(x,y,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;
}

猜你喜欢

转载自blog.csdn.net/wardseptember/article/details/80635286