PAT甲题题解-1091. Acute Stroke (30)-BFS
题意:给定三维数组,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的更多相关文章
- PAT甲题题解-1030. Travel Plan (30)-最短路+输出路径
模板题最短路+输出路径如果最短路不唯一,输出cost最小的 #include <iostream> #include <cstdio> #include <algorit ...
- PAT甲题题解-1103. Integer Factorization (30)-(dfs)
该题还不错~. 题意:给定N.K.P,使得可以分解成N = n1^P + … nk^P的形式,如果可以,输出sum(ni)最大的划分,如果sum一样,输出序列较大的那个.否则输出Impossible. ...
- PAT甲题题解-1004. Counting Leaves (30)-统计每层叶子节点个数+dfs
统计每层的叶子节点个数建树,然后dfs即可 #include <iostream> #include <cstdio> #include <algorithm> # ...
- PAT甲题题解-1022. Digital Library (30)-map映射+vector
博主欢迎转载,但请给出本文链接,我尊重你,你尊重我,谢谢~http://www.cnblogs.com/chenxiwenruo/p/6789235.html特别不喜欢那些随便转载别人的原创文章又不给 ...
- PAT甲题题解-1072. Gas Station (30)-dijkstra最短路
题意:从m个加油站里面选取1个站点,使得其离住宅的最近距离mindis尽可能地远,并且离所有住宅的距离都在服务范围ds之内.如果有很多相同mindis的加油站,输出距所有住宅平均距离最小的那个.如果平 ...
- PAT甲题题解-1107. Social Clusters (30)-PAT甲级真题(并查集)
题意:有n个人,每个人有k个爱好,如果两个人有某个爱好相同,他们就处于同一个集合.问总共有多少个集合,以及每个集合有多少人,并按从大到小输出. 很明显,采用并查集.vis[k]标记爱好k第一次出现的人 ...
- PAT甲题题解-1111. Online Map (30)-PAT甲级真题(模板题,两次Dijkstra,同时记下最短路径)
题意:给了图,以及s和t,让你求s到t花费的最短路程.最短时间,以及输出对应的路径. 对于最短路程,如果路程一样,输出时间最少的. 对于最短时间,如果时间一样,输出节点数最少的. 如果最短路程 ...
- PAT 1091 Acute Stroke [难][bfs]
1091 Acute Stroke (30 分) One important factor to identify acute stroke (急性脑卒中) is the volume of the ...
- 1091. Acute Stroke (30)
题目如下: One important factor to identify acute stroke (急性脑卒中) is the volume of the stroke core. Given ...
随机推荐
- PgSQL基础之 安装postgresql数据系统
参考这位仁兄的文章,真的非常好:https://blog.csdn.net/jerry_sc/article/details/76408116#创建数据目录 后来我又自己写了一个shell脚本,来自动 ...
- KMP、扩展KMP、Manacher习题
照着这篇博客刷一下. 自己也做一下笔记 对于KMP算法,可以看我之前总结的这篇博客 hdu 3613 Best Reward 给一个字符串,字符由a~z构成,每个字符有一个权值.在某一点将字符串切成2 ...
- Sqlite的安装和简单使用
Sqlite 1 安装 首先,下载相应的版本: https://sqlite.org/download.html 其次,解压到本地,并添加到环境变量. 然后,打开 CMD 创建,输入 sqlite3 ...
- bootstrap模态框input不能获取焦点并编辑【转】
Bootstrap模态框时input标签[日期控件也有这样的问题]不能编辑的问题,下面是我的解决方法: 1.将下图中框出来的属性删掉即可: 2.兼容火狐浏览器,笔者在火狐中还是不能编辑,去掉下图属性即 ...
- mapreduce设置setMapOutputKeyClass与setMapOutputValueClass原因
一般的mapreduce的wordcount程序如下: public class WcMapper extends Mapper<LongWritable, Text, Text, LongWr ...
- WorldWind源码剖析系列:网络下载类WebDownload
网络下载类WebDownload封装了对请求的瓦片进行网络下载的相关操作.该类使用了两个委托类型和一个枚举类型. 该类的类图如下. 网络下载类WebDownload各个字段和属性的含义说明如下: st ...
- Python2.7-tempfile
tempfile 模块,生成临时文件夹或文件,所生成的文件(夹)的名字都是随机的,但可以指定前缀.后缀和路径,中间由6位随机字符组成.应用程序经常要保存一些临时的信息,这些信息不是特别重要,没有必要写 ...
- 蓝桥杯之 2n皇后问题(双层dfs,暴力)
Description 给定一个n*n的棋盘,棋盘中有一些位置不能放皇后.现在要向棋盘中放入n个黑皇后 和n个白皇后,使任意的两个黑皇后都不在同一行.同一列或同一条对角线上,任意的两 个白皇后都不在同 ...
- Spring3 访问静态资源
<mvc:resources location="/jquery/" mapping="/jquery/**"/> <mvc:resource ...
- Django Rest Framework源码剖析(八)-----视图与路由
一.简介 django rest framework 给我们带来了很多组件,除了认证.权限.序列化...其中一个重要组件就是视图,一般视图是和路由配合使用,这种方式给我们提供了更灵活的使用方法,对于使 ...