题意:给定三维数组,0表示正常,1表示有肿瘤块,肿瘤块的区域>=t才算是肿瘤,求所有肿瘤块的体积和

这道题一开始就想到了dfs或者bfs,但当时看数据量挺大的,以为会导致栈溢出,所以并没有立刻写,想有没有别的办法。
然而结果是,实在想不出别的办法了,所以还是尝试写写dfs、bfs。

一开始先用了dfs,最后两个样例段错误,估计是栈溢出了。
之所以dfs栈溢出,因为dfs的时候每个状态都会存储在堆栈里,就好比dfs的第一个状态,一直保存到最后整个dfs结束。
而bfs是存储在队列中,每次队列都会有状态取出来,所以栈存储就会少很多。

对于每次bfs,计算肿瘤块体积,如果>=t,才算入总和sum中。
用vis[i][j][k]标记结点是否被访问过,被访问过的就不会再次访问,即不会再加入到队列中去。

PS:这里slice和vis数组开成了62*1288*130,即每个维度都比原来多2,是为了处理数组越界

#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <queue>
using namespace std;
int m,n,l,t;
bool slice[][][]; //即输入
bool vis[][][]; //标记对应的点是否访问过
int cnt=;
struct Node{
int i,j,k;
};
int BFS(int a,int b,int c){
if(vis[a][b][c] || slice[a][b][c]==false)
return ;
Node t;
int i,j,k;
int res=;
queue<Node>q;
t.i=a;
t.j=b;
t.k=c;
q.push(t);
vis[a][b][c]=true;
while(!q.empty()){
t=q.front();
q.pop();
i=t.i;
j=t.j;
k=t.k;
if(i== || i>l || j== || j>m || k== || k>n)
continue;
res++;
//六个方向
if(slice[i][j-][k] && !vis[i][j-][k]){
t.i=i;
t.j=j-;
t.k=k;
q.push(t);
vis[i][j-][k]=true;
}
if(slice[i][j+][k] && !vis[i][j+][k]){
t.i=i;
t.j=j+;
t.k=k;
q.push(t);
vis[i][j+][k]=true;
}
if(slice[i][j][k-] && !vis[i][j][k-]){
t.i=i;
t.j=j;
t.k=k-;
q.push(t);
vis[i][j][k-]=true;
}
if(slice[i][j][k+] && !vis[i][j][k+]){
t.i=i;
t.j=j;
t.k=k+;
q.push(t);
vis[i][j][k+]=true;
}
if(slice[i+][j][k] && !vis[i+][j][k]){
t.i=i+;
t.j=j;
t.k=k;
q.push(t);
vis[i+][j][k]=true;
}
if(slice[i-][j][k] && !vis[i-][j][k]){
t.i=i-;
t.j=j;
t.k=k;
q.push(t);
vis[i-][j][k]=true;
}
}
return res;
}
int main()
{
memset(vis,false,sizeof(vis));
memset(slice,false,sizeof(slice));
int a;
scanf("%d %d %d %d",&m,&n,&l,&t);
for(int i=;i<=l;i++){
for(int j=;j<=m;j++){
for(int k=;k<=n;k++){
scanf("%d",&a);
if(a==)
slice[i][j][k]=true;
else
slice[i][j][k]=false;
}
}
} int sum=;
for(int i=;i<=l;i++){
for(int j=;j<=m;j++){
for(int k=;k<=n;k++){
cnt=BFS(i,j,k);
if(cnt>=t)
sum+=cnt;
}
}
}
printf("%d\n",sum);
return ;
}

PAT甲题题解-1091. Acute Stroke (30)-BFS的更多相关文章

  1. PAT甲题题解-1030. Travel Plan (30)-最短路+输出路径

    模板题最短路+输出路径如果最短路不唯一,输出cost最小的 #include <iostream> #include <cstdio> #include <algorit ...

  2. PAT甲题题解-1103. Integer Factorization (30)-(dfs)

    该题还不错~. 题意:给定N.K.P,使得可以分解成N = n1^P + … nk^P的形式,如果可以,输出sum(ni)最大的划分,如果sum一样,输出序列较大的那个.否则输出Impossible. ...

  3. PAT甲题题解-1004. Counting Leaves (30)-统计每层叶子节点个数+dfs

    统计每层的叶子节点个数建树,然后dfs即可 #include <iostream> #include <cstdio> #include <algorithm> # ...

  4. PAT甲题题解-1022. Digital Library (30)-map映射+vector

    博主欢迎转载,但请给出本文链接,我尊重你,你尊重我,谢谢~http://www.cnblogs.com/chenxiwenruo/p/6789235.html特别不喜欢那些随便转载别人的原创文章又不给 ...

  5. PAT甲题题解-1072. Gas Station (30)-dijkstra最短路

    题意:从m个加油站里面选取1个站点,使得其离住宅的最近距离mindis尽可能地远,并且离所有住宅的距离都在服务范围ds之内.如果有很多相同mindis的加油站,输出距所有住宅平均距离最小的那个.如果平 ...

  6. PAT甲题题解-1107. Social Clusters (30)-PAT甲级真题(并查集)

    题意:有n个人,每个人有k个爱好,如果两个人有某个爱好相同,他们就处于同一个集合.问总共有多少个集合,以及每个集合有多少人,并按从大到小输出. 很明显,采用并查集.vis[k]标记爱好k第一次出现的人 ...

  7. PAT甲题题解-1111. Online Map (30)-PAT甲级真题(模板题,两次Dijkstra,同时记下最短路径)

    题意:给了图,以及s和t,让你求s到t花费的最短路程.最短时间,以及输出对应的路径.   对于最短路程,如果路程一样,输出时间最少的. 对于最短时间,如果时间一样,输出节点数最少的.   如果最短路程 ...

  8. PAT 1091 Acute Stroke [难][bfs]

    1091 Acute Stroke (30 分) One important factor to identify acute stroke (急性脑卒中) is the volume of the ...

  9. 1091. Acute Stroke (30)

    题目如下: One important factor to identify acute stroke (急性脑卒中) is the volume of the stroke core. Given ...

随机推荐

  1. [BZOJ 4763]雪辉

    [BZOJ 4763] 雪辉 题意 给定一棵 \(n\) 个点的无根树, 点带权. \(q\) 次询问, 每次给定树上的若干路径, 求这些路径上的点共有多少种不同权值以及这些点的权值组成的集合的 \( ...

  2. C++第六次作业

    前言 拿到作业的时候,整个人都不好了,虽然之前和同学说以后一起写游戏,画界面,然而现在的自己对界面的知识一窍不通,虽然同学分享了一些资料,但是通过这次作业,发现自己火候还是不够-- 问题描述及仓库地址 ...

  3. python 爬取全量百度POI

    在网上找了很多关于爬取百度POI的文章,但是对“全量”的做法并没有得到最终的解决方案,自己写了一个,但还是不能实现全量POI抓取,能够达到至少50%的信息抓取.注意:这里所指“全量”是能够达到100% ...

  4. [TJOI2013]拯救小矮人

    题目 首先有一个很假的贪心 我们定义一个人的需求为\(H-h_i-b_i\),就是这个人需要多少的高度在他下面他才能逃出去 我们趁剩余的高度还够,优先满足需求较高的 显然是错的,可能有一个人身高很高, ...

  5. CJOJ 【DP合集】最长上升序列2 — LIS2

    题面 已知一个 1 ∼ N 的排列的最长上升子序列长度为 K ,求合法的排列个数. 好题(除了我想不出来我应该找不到缺点), 想一想最长上升子序列的二分做法, 接在序列后面或者替换. 所以对于每一个位 ...

  6. Dubbo -- 系统学习 笔记 -- 目录

    用户指南 入门 背景 需求 架构 用法 快速启动 服务提供者 服务消费者 依赖 必需依赖 缺省依赖 可选依赖 成熟度 功能成熟度 策略成熟度 配置 Xml配置 属性配置 注解配置 API配置 示例 启 ...

  7. 基于jmxtrans+influxdb+grafana实现对canal监控

    最近在调研canal数据同步系统的监控方案,网上关于jmxtrans+influxdb+grafana监控kafka的文档很多,没有监控canal的.通过几天的摸索,大致明白了来龙去脉.监控流程基本是 ...

  8. Linux下RPM包的安装

    Linux下RPM包安装 二进制包(RPM包.系统默认包) RPM安装 rpm -ivh 包全名(查询依赖网址:http://www.rpmfind.net) -i(install):安装 -v(ve ...

  9. 剑指offer.从未到头打印链表

    输入一个链表的头结点,按照 从尾到头 的顺序返回节点的值.返回的结果用数组存储. 样例 输入:[2, 3, 5] 返回:[5, 3, 2] 1.使用栈. class Solution { public ...

  10. Python2.7-math, cmath

    math,cmath 模块,提供了用C标准定义的数学函数,简单说就是效率较高,cmath 不仅有 math 的功能,还增加了计算复数的函数.这两个模块返回的值基本上为 float 类型,除非明确指出返 ...