• L3-004 肿瘤诊断 dfs bfs


      

    在诊断肿瘤疾病时,计算肿瘤体积是很重要的一环。给定病灶扫描切片中标注出的疑似肿瘤区域,请你计算肿瘤的体积。

    输入格式:

    输入第一行给出4个正整数:M、N、L、T,其中M和N是每张切片的尺寸(即每张切片是一个M×N的像素矩阵。最大分辨率是1);L(≤)是切片的张数;T是一个整数阈值(若疑似肿瘤的连通体体积小于T,则该小块忽略不计)。

    最后给出L张切片。每张用一个由0和1组成的M×N的矩阵表示,其中1表示疑似肿瘤的像素,0表示正常像素。由于切片厚度可以认为是一个常数,于是我们只要数连通体中1的个数就可以得到体积了。麻烦的是,可能存在多个肿瘤,这时我们只统计那些体积不小于T的。两个像素被认为是“连通的”,如果它们有一个共同的切面,如下图所示,所有6个红色的像素都与蓝色的像素连通。

    输出格式:

    在一行中输出肿瘤的总体积。

    输入样例:

    3 4 5 2
    1 1 1 1
    1 1 1 1
    1 1 1 1
    0 0 1 1
    0 0 1 1
    0 0 1 1
    1 0 1 1
    0 1 0 0
    0 0 0 0
    1 0 1 1
    0 0 0 0
    0 0 0 0
    0 0 0 1
    0 0 0 1
    1 0 0 0
    

    输出样例:

    26


    dfs一直爆栈 最后两个点一直过不了 段错误
    换成bfs就能过 还是bfs大法好
    #include<bits/stdc++.h>
    using namespace std;
    //input
    #define rep(i,a,b) for(int i=(a);i<=(b);i++)
    #define RI(n) scanf("%d",&(n))
    #define RII(n,m) scanf("%d%d",&n,&m);
    #define RIII(n,m,k) scanf("%d%d%d",&n,&m,&k)
    #define RS(s) scanf("%s",s);
    #define LL long long
    #define REP(i,N)  for(int i=0;i<(N);i++)
    #define CLR(A,v)  memset(A,v,sizeof A)
    //////////////////////////////////
    #define N 1500
    int n,m,z,t;
    long long sum=0;
    int cnt=0;
    int mp[N][200][70];
    int vis[N][200][70];
    bool inmap(int x,int y,int s)
    {
        return x>=1&&x<=n&&y>=1&&y<=m&&s>=1&&s<=z;
    }
    int dx[6]={1,-1,0,0,0,0};
    int dy[6]={0,0,1,-1,0,0};
    int dz[6]={0,0,0,0,1,-1};
    void dfs(int x,int y,int z)
    {
        vis[x][y][z]=1;
    
        for(int i=0;i<6;i++)
        {
            int a=x+dx[i];
            int b=y+dy[i];
            int c=z+dz[i];
            if(!inmap(a,b,c))continue;
            if(mp[a][b][c]&&!vis[a][b][c])
            {
                cnt++;
                dfs(a,b,c);
            }
        }
        return ;
    }
    
    int main()
    {
       RIII(n,m,z);RI(t);
       rep(k,1,z)
       rep(i,1,n)
       rep(j,1,m)
       RI(mp[i][j][k]);
       rep(k,1,z)
       rep(i,1,n)
       rep(j,1,m)
       if(mp[i][j][k]&&!vis[i][j][k])
        {
            cnt=1;
            dfs(i,j,k);
            if(cnt>=t)sum+=cnt;
        }
       cout<<sum;
        return 0;
    }
    View Code

    bfs:

    #include<stdio.h>
    #include<queue>
    #include<algorithm>
    using namespace std;
    
    int a[61][130][1300];
    int area=0;
    int dx[6][3]={{1,0,0},{-1,0,0},{0,1,0},{0,-1,0},{0,0,1},{0,0,-1}};//6个方向
    int n,m,l,t;
    
    struct p{
        int x,y,z;
    }k,o;
    
    int check(int x,int y,int z){//x,y,z是否合法
        if(x<0||y<0||z<0)return 0;
        if(x>=l||y>=n||z>=m)return 0;
        return 1;
    }
    
    void bfs(int x,int y,int z){
        queue<p> qu;
        int sum=1; 
        
        k.x=x;k.y=y;k.z=z;
        a[k.x][k.y][k.z]=0;//开始的点别忘了归0 
        qu.push(k);
        
        while(!qu.empty()){
            k=qu.front();
            qu.pop();
            for(int i=0;i<6;i++){
                o.x=k.x+dx[i][0];
                o.y=k.y+dx[i][1];
                o.z=k.z+dx[i][2];
                if(check(o.x,o.y,o.z)&&a[o.x][o.y][o.z]){
                    a[o.x][o.y][o.z]=0;//访问过了就归0
                    sum++;
                    qu.push(o);
                }
            }
        }
        if(sum>=t)
            area+=sum;
    }
    int main(){
        scanf("%d%d%d%d",&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++)
                scanf("%d",&a[k][i][j]);
            }
        }
        
        for(int k=0;k<l;k++){
            for(int i=0;i<n;i++){
                for(int j=0;j<m;j++)
                    if(a[k][i][j])
                        bfs(k,i,j); 
            }
        }
        printf("%d
    ",area);
        return 0;
    }
    View Code







  • 相关阅读:
    如何解决DEDE织梦友情链接字数限制与链接个数限制的问题?
    织梦内容页调取文章缩略图
    如何删除织梦系统power by dedecms
    在联系我们里面添加公司地图坐标地理位置
    织梦后台添加了一篇文章 但是前台显示两篇一模一样的文章
    dedecms织梦上下页标签和CSS
    ZooKeeper+Dubbox分布式框架
    mac远程控制linux,安装jdk
    mac下myeclipse2017安装activiti插件
    java为什么要实现serializable序列化
  • 原文地址:https://www.cnblogs.com/bxd123/p/10524663.html
Copyright © 2020-2023  润新知