题意:给定三维数组,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. 数值分析 最小二乘 matlab

    1. 已知函数在下列各点的值为   -1 -0.75 -0.5 0 0.25 0.5 0.75   1.00 0.8125 0.75 1.00 1.3125 1.75 2.3125 分别用一次.二次. ...

  2. openlayer3 基础学习一创建&显示地图

    <!doctype html> <html lang="en"> <head> <link rel="stylesheet&qu ...

  3. spark的shuffle和原理分析

    概述     Shuffle就是对数据进行重组,由于分布式计算的特性和要求,在实现细节上更加繁琐和复杂.    在MapReduce框架,Shuffle是连接Map和Reduce之间的桥梁,Map阶段 ...

  4. os.path.md

    os.path 我们可以利用os.path模块提供的函数更容易地在跨平台上处理文件. 即使我们的程序不是用于夸平台, 也应该使用os.path来让路径名字更加可靠. Parsing Paths os. ...

  5. BZOJ2893:征服王(费用流)

    Description 虽然春希将信息传递给了雪菜,但是雪菜却好像完全不认得春希了.心急如焚的春希打开了第二世代机能,对雪菜的脑内芯片进行了直连-hack. 进入到雪菜内部的春希发现(这什么玩意..) ...

  6. laravel记录笔记Laravel 连接数据库、操作数据库的三种方式

    laravel中提供DB facade(原始查找).查询构造器.Eloquent ORM三种操作数据库方式 1.连接数据库 .env 数据库配置 DB_HOST=localhost dbhost DB ...

  7. [Java123] JBoss

    https://blog.csdn.net/taogebx/article/details/4620760

  8. 写出js内存泄漏的问题?

    回答一: (1)IE7/8 DOM对象或者Active对象循环引用导致内存泄漏 a.多个对象循环引用 b.循环的DOM泄漏 (2)基础的DOM泄漏 当原有的DOM被移除时,子节点引用没有被移除则无法回 ...

  9. Dig命令解析结果

    dig -t RT NAME @NS -t RT 指定要查询的资源记录类型 NAME 需要解析的域(域名) @NS 指定那个域名服务器负责解析 [root@xss ~]# dig www.ihoney ...

  10. scrt中使用alt键

    session Options-->Terminal---->Emulation------>Emacs----->Use ALT as meta key