1091 Acute Stroke (30分)

脑卒中,给定l个切片,切片大小为m×n。切片用0和1的矩阵表示。某一点所在切片的上下左右点和相邻两切片的相同位置点算作相连。计算相连的块的体积,超过阈值就加进总值,最后给出总值。

找到未访问的值为1的点,加进队列,标记访问,该块的体积数++。如果访问过或者值不为1就跳过。然后当队列不为空时把该点的相邻点都进行判断(加进队列)。最后返回的时候判断该块体积是否超过阈值,超过则加进总值,最后输出。

dfs最后两个点过不了,段错误,应该是爆栈了。没办法只能写队列。最后也是在超时边缘试探(刚好卡着600ms)

#include <bits/stdc++.h>
using namespace std;
int m,n,l,t;
struct Node{
    bool vis=false,val=false;
};
int sum=0;
Node mat[65][1300][130];
queue<vector<int> > q;

void judge(int idx1,int idx2,int idx3,int &currsum){
    if(idx1>=l || idx1<0 ||idx2<0 ||idx2>=m ||idx3<0 ||idx3>=n)return;
    if(!mat[idx1][idx2][idx3].vis && mat[idx1][idx2][idx3].val){
        vector<int> temp;
        temp.push_back(idx1);
        temp.push_back(idx2);
        temp.push_back(idx3);
        q.push(temp);
        mat[idx1][idx2][idx3].vis=true;
        currsum++;
    }
}
void bfs(int idx1,int idx2,int idx3,int &currsum){//idx1:l 2:m 3:n
    judge(idx1,idx2,idx3,currsum);
    while(!q.empty()){
        vector<int> t=q.front();
        q.pop();
        judge(t[0]-1,t[1],t[2],currsum);
        judge(t[0]+1,t[1],t[2],currsum);
        judge(t[0],t[1]-1,t[2],currsum);
        judge(t[0],t[1]+1,t[2],currsum);
        judge(t[0],t[1],t[2]-1,currsum);
        judge(t[0],t[1],t[2]+1,currsum);
    }
}

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;k<n;k++){
                int val;
                scanf("%d",&val);
                if(val==1)mat[i][j][k].val=true;
            }
        }
    }
    for(int i=0;i<l;i++){
        for(int j=0;j<m;j++){
            for(int k=0;k<n;k++){
                if(!mat[i][j][k].vis && mat[i][j][k].val){
                    int num=0;
                    bfs(i,j,k,num);
                    if(num>=t)sum+=num;
                }
            }
        }
    }
    printf("%d",sum);
}

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值