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 ...
随机推荐
- vue-cli静态资源处理
vue-cli是利用webpack进行打包部署,其中静态资源的路径问题是一个比较麻烦的部分. 项目中共有两个存放静态文件的地方. /static 根目录下的static文件夹 assets src目录 ...
- Angular简介与程序架构
什么是angularJs 基于javascript开发的客户端应用框架,使我们可以更加快捷,简单的开发web应用. 诞生于2009年,后来被google收购,用在了很多项目中. 适用于CRUD应用或者 ...
- Breaking Down Type Erasure in Swift
Type Erasure Pattern We can use the type erasure pattern to combine both generic type parameters and ...
- Spark项目之电商用户行为分析大数据平台之(十)IDEA项目搭建及工具类介绍
一.创建Maven项目 创建项目,名称为LogAnalysis 二.常用工具类 2.1 配置管理组建 ConfigurationManager.java import java.io.InputStr ...
- scrapy shell
一.scrapy shell 1.安装pip install Jupyter 2.在pycharm中的启动命令: scrapy shell 注:启动后关键字高亮显示 3.查看response 执行sc ...
- cocoapods 报错
1.[!] ERROR: Parsing unable to continue due to parsing error: contained in the file located at xxx/x ...
- memset()初始化为1的那些事
问题代码: #include <stdio.h> #include <string.h> int main() { ]; int a; while(~scanf("% ...
- DB-Engines Ranking
DB-Engines Ranking trend chart The DB-Engines Ranking ranks database management systems according to ...
- Docker 修改已有镜像(转)
1.当结束后,我们使用 exit 来退出,现在我们的容器已经被我们改变了,使用 docker commit 命令来提交更新后的副本. 其中,-m 来指定提交的说明信息,跟我们使用的版本控制工具一样:- ...
- jqgrid 单列排序和组合排序
有时,我们需要设置jqgrid表格按某个列排序,或则按多个列组合排序.如何实现? 1)设置可以排序的列 sortable: true 2)设置 multiSort: true 启用组合排序 $(&q ...