当前位置: 首页 > news >正文

PAT 甲级 1091 Acute Stroke

一开始只是简单的递归(bfs),导致最后两个没法通过(爆栈了)

//最后两个案例没有通过,只是最简单的bfs暴力算法
#include<cstdio>
using namespace std;
int v[62][1288][130]={0};
int find(int i,int j,int k){
    int sum=1;
    v[i][j][k]=2;
    if(v[i][j][k+1]==1) sum+=find(i,j,k+1);
    if(v[i][j][k-1]==1) sum+=find(i,j,k-1);
    if(v[i][j+1][k]==1) sum+=find(i,j+1,k);
    if(v[i][j-1][k]==1) sum+=find(i,j-1,k);
    if(v[i+1][j][k]==1) sum+=find(i+1,j,k);
    if(v[i-1][j][k]==1) sum+=find(i-1,j,k);
    return sum;
}
int main(){
    int m,n,l,t,ans=0,f;
    scanf("%d %d %d %d",&m,&n,&l,&t);
    // vector<vector<int>>v[l];
    for(int i=1;i<=l;i++){
        for(int j=1;j<=m;j++){
            for(int k=1;k<=n;k++){
                scanf("%d",&v[i][j][k]);
            }
        }
    }
    for(int i=1;i<=l;i++){
        for(int j=1;j<=m;j++){
            for(int k=1;k<=n;k++){
                if(v[i][j][k]==1){
                    f=find(i,j,k);
                    ans+=f>=t? f:0;
                }
            }
        }
    }
    printf("%d",ans);
    return 0;
}

后面看了书上的使用queue存储走过的路径,就不用使用递归了。

//求有问题的总体积
//AC
#include<cstdio>
#include<queue>
using namespace std;
int v[62][1288][130]={0};
struct node{
    int i,j,k;
};
queue <node> q;
int bfs(){
    int num=0;
    while(!q.empty()){
        node a=q.front();
        q.pop();
        int i=a.i,j=a.j,k=a.k;
        if(v[i][j][k]==2) continue;
        num++;
        v[i][j][k]=2;
        if(v[i][j][k+1]==1) q.push({i,j,k+1});
        if(v[i][j][k-1]==1) q.push({i,j,k-1});
        if(v[i][j+1][k]==1) q.push({i,j+1,k});
        if(v[i][j-1][k]==1) q.push({i,j-1,k});
        if(v[i+1][j][k]==1) q.push({i+1,j,k});
        if(v[i-1][j][k]==1) q.push({i-1,j,k});
    }
    return num;
}
int main(){
    int m,n,l,t,ans=0,f;
    scanf("%d %d %d %d",&m,&n,&l,&t);
    for(int i=1;i<=l;i++){
        for(int j=1;j<=m;j++){
            for(int k=1;k<=n;k++){
                scanf("%d",&v[i][j][k]);
            }
        }
    }
    for(int i=1;i<=l;i++){
        for(int j=1;j<=m;j++){
            for(int k=1;k<=n;k++){
                if(v[i][j][k]==1){
                    q.push({i,j,k});
                    f=bfs();
                    ans+=f>=t? f:0;
                }
            }
        }
    }
    printf("%d",ans);
    return 0;
}

相关文章:

  • 网络安全监测探针安装位置 网络安全监测系统
  • ZLMediaKi集群设置
  • Python部署工控安全风险评估系统
  • 字节火山引擎 DeepSeek 接入本地使用
  • mongodb的并发优化
  • 网络安全风险事件排名 网络安全事件划分
  • MobaXterm_Portable_v23.2 免费下载与使用教程(附安卓替代方案)
  • 模型思维 - 领域模型的应用与解析
  • 8.日常英语笔记
  • 【每日八股】MySQL篇(二):事务
  • 文档检索服务平台
  • 23贪心算法
  • 【蓝桥杯单片机】客观题
  • 如何在 macOS 上配置 MySQL 环境变量
  • 【ROS2】第三方库学习:Eigen(线性代数:矩阵、向量)
  • 接雨水的算法
  • Linux nc 命令详解
  • Android Studio2024版本安装环境SDK、Gradle配置
  • 《Linux命令行和shell脚本编程大全》第一章阅读笔记
  • 【YOLOv8】YOLOv8改进系列(2)----替换主干网络之FasterNet(CVPR 2023)
  • 长安公司网站设计/足球直播在线直播观看免费cctv5
  • 学网站开发的软件/关键词下载
  • 门户网站定制服务器/软文推广软文营销
  • 企业网络规划与设计方案/网络seo优化
  • wordpress后台500错误/seo排名优化首页
  • 做外贸网站应该关注哪些地方/百度网址大全下载