本题考BFS应用,题目大意是给出一个三维0,1矩阵,你需要对任意一个元素的上下左右前后进行判断枚举,如果当前元素为1且满足要求,则入队,当前枚举结束后如果该’1’矩阵不小于一个’l’代表的阈值则返回其中’1’的数量,其实原题要求我们对每一个满足要求的’1’矩阵求其体积volum,但是因为每一个1代表一个符合要求的元素,所以直接对1的个数进行计数就可以省去求体积的繁琐步骤,对于这种需要枚举矩阵中不同方向的元素的题目,通常选择使用一个“增量数组”来解决,初始化每个方向的所有可能值进入数组中就可以对任意一个位置的元素实现不同方向的遍历。BFS与DFS一样,有一个类似于模板的思路,我已经总结发布在“算法”目录里,有意者可以从我的主页中查找得到。

代码:

#include<cstdio>
#include<queue>
using namespace std;
struct node{int x,y,z;
}Node;int m,n,slice,t;
int pixel[1290][130][61];
bool inq[1290][130][61] = {false};
int X[6] = {0,0,0,0,1,-1};
int Y[6] = {0,0,1,-1,0,0};
int Z[6] = {1,-1,0,0,0,0};bool judge(int x,int y,int z){if(x < 0 || x>= n || y < 0 || y >= m || z < 0 || z >= slice) return false;if(inq[x][y][z] == true || pixel[x][y][z] == 0) return false;return true;
}int bfs(int x,int y,int z){int tot = 0;queue<node> q;Node.x = x; Node.y = y; Node.z = z;q.push(Node);inq[x][y][z] = true;while(!q.empty()){node top = q.front();q.pop();tot++;for(int i=0;i<6;i++){int newx = top.x + X[i];int newy = top.y + Y[i];int newz = top.z + Z[i];if(judge(newx,newy,newz)){q.push({newx,newy,newz});inq[newx][newy][newz] = true;}}}if(tot >= t) return tot;else return 0;
}int main() {scanf("%d%d%d%d", &n, &m, &slice, &t);for (int z = 0; z < slice; z++) {for (int i = 0; i < n; i++) {for (int j = 0; j < m; j++) {scanf("%d", &pixel[i][j][z]);}}}int ans = 0;for (int z = 0; z < slice; z++) {for (int i = 0; i < n; i++) {for (int j = 0; j < m; j++) {if (pixel[i][j][z] == 1 && inq[i][j][z] == false) {ans += bfs(i, j, z);}}}}printf("%d\n", ans);return 0;
}

【PAT甲级题解】1091 Acute Stroke (30分) BFS相关推荐

  1. 【PTA-A】1091 Acute Stroke (30 分)(BFS、队列)

    One important factor to identify acute stroke (急性脑卒中) is the volume of the stroke core. Given the re ...

  2. PAT甲题题解-1091. Acute Stroke (30)-BFS

    题意:给定三维数组,0表示正常,1表示有肿瘤块,肿瘤块的区域>=t才算是肿瘤,求所有肿瘤块的体积和 这道题一开始就想到了dfs或者bfs,但当时看数据量挺大的,以为会导致栈溢出,所以并没有立刻写 ...

  3. 【PAT】1091 Acute Stroke (30 分)

    三维搜索,按照6个邻接理论,总会有重合的部分区域, 因此根据搜索顺序,先访问到的就是一个区域的[不能较真] #include <bits/stdc++.h> using namespace ...

  4. 1091 Acute Stroke (30 分)【难度: 一般 / bfs】

    https://pintia.cn/problem-sets/994805342720868352/problems/994805375457411072 很常见的题,就是求每一个连通块的大小. #i ...

  5. PAT甲级1076 Forwards on Weibo (30 分) :[C++题解]图论、bfs

    文章目录 题目分析 题目来源 题目分析 来源:acwing 分析: BFS如何搜前k层?统计前k层的点数. ac代码 #include<bits/stdc++.h> using names ...

  6. PAT甲级1068 Find More Coins (30 分):[C++题解]DP、背包问题、dp输出方案

    文章目录 题目分析 题目链接 题目分析 来源:acwing 分析:m是背包容量,a1,a2,....,ana_1,a_2,....,a_na1​,a2​,....,an​是n个物品,第i个物品的体积是 ...

  7. PAT甲级1045 Favorite Color Stripe (30 分):[C++题解]最佳彩色带、DP、公共子序列变形

    文章目录 题目分析 题目链接 题目分析 来源:acwing 分析:这是一个公共子序列的问题.但是有点变式,序列a和序列b不是完全等价的,序列a的每个元素可以对应多个相同元素,而且有些元素可以不使用.比 ...

  8. PAT甲级1119 Pre- and Post-order Traversals (30分):[C++题解]暴搜dfs、前序遍历和后序遍历求中序遍历

    文章目录 题目分析 题目链接 题目分析 分析 给了前序遍历和后序遍历,能够确定根结点,但是左子树和右子树的长度是不确定的.这里采用的解决方案是枚举左子树的结点个数,其实右子树的结点个数也确定了.对于每 ...

  9. PAT甲级1143 Lowest Common Ancestor (30 分):[C++题解]LCA、最低公共祖先

    文章目录 题目分析 题目链接 题目分析 来源:acwing 分析:二叉搜索树的中序遍历是隐含给定的,它的中序遍历就是从小到大排列. 所以这道题先是根据给定的前序遍历和中序遍历,建树. 建树的时候需要用 ...

最新文章

  1. 三层交换不同VLAN间通信
  2. linux命令应用之一
  3. Supervisor行为分析和实践
  4. 设计模式学习(一)——策略模式
  5. vue动态切换css文件_vue实现样式之间的切换及vue动态样式的实现方法
  6. netflix 模式创新_创新设计模式:工厂模式
  7. java 线程数_在虚拟机中是什么限制java线程数量?这方面涉及哪些调优?
  8. cdn是什么和作用有些
  9. mongodb日志切割
  10. ElastcSearch的Mapping映射建立
  11. 课设——C语言学生成绩管理系统
  12. 7塞班贝拉系统下载_远观JAVA,近观鸿蒙,盘点那些年我们用过的手机系统
  13. php 字符串长度判断_php 字符串长度判断更高效的方法
  14. 如何在vmware workstation 8下成功安装fedora 14
  15. Zotero——下载知网PDF文件
  16. Jersey框架一:Jersey RESTful WebService框架简介
  17. 估算CarSim中车辆轮胎的纵向刚度与侧向刚度
  18. 差旅安全,你了解多少?
  19. 数值分析——自适应辛普森积分
  20. 移动硬盘不能识别的常见7种解决方案 ~ By 逆天经验

热门文章

  1. 搭建博客网站详细报告
  2. bes2300之eq调试(十一)
  3. 知识加自由才等于力量。
  4. [译 ] 云计算Cloud Computing 12章 大数据、数据流、和移动云计算 -序
  5. 无服务时代是“不分布式”云端系统的起点
  6. 电脑文件夹怎么设置密码?3个方法为文件加密!
  7. Easyui 使用 datagrid-export.js 导出数据证件号转换成科学计数法的问题,解决方案
  8. 码一篇灰色模型的博客
  9. POJ 2226 思维二分图
  10. KESION(.NET版)安装方法