1091 Acute Stroke (30 分)

读懂题后发现,这不就三维\(BFS\)裸题吗,\(30\)分的裸题可还行。

输入数据时是按多个二维矩阵的方式读入的,因此3层for循环中的第一层需要遍历矩阵编号,第二、三层才是单个矩阵的数据读入。

const int N=1300,M=130;
struct Node
{
    int x,y,z;
};
bool g[N][M][65];
int n,m,l,t;

bool check(int x,int y,int z)
{
    return x>=0 && x<n && y>=0 && y<m && z>=0 && z<l;
}

int bfs(int x,int y,int z)
{
    queue<Node> q;
    q.push({x,y,z});
    g[x][y][z]=0;
    int cnt=1;

    while(q.size())
    {
        Node t=q.front();
        q.pop();

        for(int i=0;i<6;i++)
        {
            int a=t.x+dx3[i],b=t.y+dy3[i],c=t.z+dz3[i];
            if(check(a,b,c) && g[a][b][c])
            {
                g[a][b][c]=0;
                cnt++;
                q.push({a,b,c});
            }
        }
    }
    return cnt;
}

int main()
{
    cin>>n>>m>>l>>t;

    for(int k=0;k<l;k++)
        for(int i=0;i<n;i++)
            for(int j=0;j<m;j++)
                cin>>g[i][j][k];

    int res=0;
    for(int k=0;k<l;k++)
        for(int i=0;i<n;i++)
            for(int j=0;j<m;j++)
                if(g[i][j][k])
                {
                    int cnt=bfs(i,j,k);
                    if(cnt >= t) res+=cnt;
                }

    cout<<res<<endl;
    //system("pause");
    return 0;
}
posted @ 2021-02-25 10:33  Dazzling!  阅读(35)  评论(0编辑  收藏  举报