【1091】Acute Stroke (30 分)

举报
野猪佩奇996 发表于 2022/01/23 00:28:34 2022/01/23
【摘要】 #include<iostream>#include<stdio.h>#include<stdlib.h>#include<math.h>#include<string.h>#include<algorithm> #include<map>#inclu...

  
  1. #include<iostream>
  2. #include<stdio.h>
  3. #include<stdlib.h>
  4. #include<math.h>
  5. #include<string.h>
  6. #include<algorithm>
  7. #include<map>
  8. #include<vector>
  9. #include<queue>
  10. using namespace std;
  11. //利用BFS遍历,找到卒中核心块
  12. struct node{
  13. int x,y,z; //位置(x,y,z)
  14. }Node;
  15. int n,m,slice,T; //矩阵为n*m,共有slice层,T为卒中核心区中1的个数的下限
  16. int pixel[1290][130][61]; //三维01矩阵
  17. bool inq[1290][130][61] = {false}; //记录位置(x,y,z)是否已入过队
  18. int X[6]={0,0,0,0,1,-1}; //增量矩阵!!!一开始在1和-1之间漏了逗号。。。
  19. int Y[6]={0,0,1,-1,0,0};
  20. int Z[6]={1,-1,0,0,0,0};
  21. /*
  22. int X[6] = {0, 0, 0, 0, 1, -1};
  23. int Y[6] = {0, 0, 1, -1, 0, 0};
  24. int Z[6] = {1, -1, 0, 0, 0, 0};
  25. */
  26. bool judge(int x,int y,int z){ //判断坐标(x,y,z)是否需要访问
  27. //越界返回false
  28. if(x>=n || x<0 || y>=m || y<0 || z>=slice || z<0) return false;
  29. //若当前位置为0或(x,y,z)已入队,则返回false
  30. if(pixel[x][y][z] == 0 || inq[x][y][z] == true) return false;
  31. //以上都不满足,返回true
  32. return true;
  33. }
  34. //BFS函数访问位置(x,y,z)所在的块,将该块所有"1"的inq都设置为true
  35. int BFS(int x,int y,int z){
  36. int tot=0; //计数当前块中1的个数
  37. queue<node> Q; //定义队列
  38. Node.x=x,Node.y=y,Node.z=z; //结点Node的位置为(x,y,z)
  39. Q.push(Node); //将结点Node入队
  40. inq[x][y][z]=true; //设置位置(x,y,z)已入过队
  41. while( !Q.empty() ){
  42. node top=Q.front(); //取出队首元素
  43. Q.pop(); //队首元素出队
  44. tot++; //当前块中1的个数加1
  45. for(int i=0;i<6;i++) { //循环6次,得到6个增量方向
  46. int newX=top.x+X[i];
  47. int newY=top.y+ Y[i];
  48. int newZ=top.z+Z[i];
  49. if( judge(newX,newY,newZ) ) { //新位置(newX,newY,newZ)需要访问
  50. //设置Node的坐标
  51. Node.x=newX, Node.y=newY, Node.z=newZ;
  52. Q.push(Node); //将结点Node入队
  53. inq[newX][newY][newZ]=true ; //设置(newX,newY,newZ)已入过队
  54. }
  55. }
  56. }
  57. if(tot >= T) return tot; //如果超过阈值,则返回
  58. else return 0; //否则不记录该块1的个数
  59. }
  60. int main(){
  61. scanf("%d%d%d%d",&n,&m,&slice,&T);
  62. for(int z=0; z<slice; z++){ //注意先枚举切片层号!!!
  63. for(int x=0; x<n; x++){
  64. for(int y=0; y<m; y++){
  65. scanf("%d",&pixel[x][y][z]);
  66. }
  67. }
  68. }
  69. int ans=0; //记录卒中核心区中1的个数总和
  70. for(int z=0;z<slice; z++){
  71. for(int x=0;x<n ; x++) {
  72. for(int y=0;y<m; y++){
  73. //如果当前位置为1,且未被访问,则BFS当前块
  74. if(pixel[x][y][z]==1 && inq[x][y][z]==false){
  75. ans += BFS(x,y,z);
  76. }
  77. }
  78. }
  79. }
  80. printf("%d\n",ans);
  81. system("pause");
  82. return 0;
  83. }

 

文章来源: andyguo.blog.csdn.net,作者:山顶夕景,版权归原作者所有,如需转载,请联系作者。

原文链接:andyguo.blog.csdn.net/article/details/99248669

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。