PAT A1091 Acute Stroke (30point(s))

题目链接
该题本质就是遍历连通分支的问题,只不过是将二维矩阵拓展到三维矩阵,做法类似,算法思想可以看我的另一篇文章。
求矩阵的连通分支数问题
不过本题遍历连通块不能用DFS算法,因为最后两个样例连通块太深,递归的系统栈达到上限,从而爆栈,故最好用BFS算法,缺点就是要建队列,代码不够简洁。
AC Code:

#include<cstdio>
#include<queue>
using namespace std;
int m,n,l,T,ans=0;//m为行,n为列,l为层,ans为最后的输出数
int matrix[60][1286][128],inq[60][1286][128]={0};
//matrix为三维的0,1矩阵,第一维是层,后两维是行列,也可把层放在第三维
//inq判断该位置是否入过队列的三维数组,inq[z][x][y]=1表示第z层的第x行第y列元素已经入过队列了
struct node{//位置坐标
    int x,y,z;
}Node;
int X[8]={1,-1,0,0,0,0},Y[8]={0,0,1,-1,0,0},Z[8]={0,0,0,0,1,-1};
//三维增量数组,用于查询相邻位
bool judge(int x,int y,int z){//判断该位是否应该入队列
    if(x<0||x>=m||y<0||y>=n||z<0||z>=l) return false;
    //超界,返回false
    if(matrix[z][x][y]==0||inq[z][x][y]==1) return false;
    //该位为0或已经入过队列了,返回false
    return true;
    //以上均不满足,返回true
}
void BFS(int x,int y,int z){
    queue<node> q;//初始化队列
    int cnt=0;//记录当前块中1的个数
    Node.x=x;Node.y=y;Node.z=z;//为结点赋坐标值
        q.push(Node);//结点入队列
        inq[z][x][y]=1;//标记已入队列
        while(!q.empty()){
            node top=q.front();//取队首元素
            q.pop();//队首元素出队列
            cnt++;//当前块1个数加1
            for(int i=0;i<6;i++){//循环6次,得到6个增量方向
                int newx=top.x+X[i];
                int newy=top.y+Y[i];
                int newz=top.z+Z[i];
                if(judge(newx,newy,newz)){//如果新的位置未入过队
                    Node.x=newx;Node.y=newy;Node.z=newz;
                    q.push(Node);//将结点入队
                    inq[newz][newx][newy]=1;//标记该位置已经入过队
                    }
                }
            }
            if(cnt>=T) ans+=cnt;//当前块1个数超过阈值,要累加到最终结果内
  }
int main(){
    scanf("%d%d%d%d",&m,&n,&l,&T);
     for(int z=0;z<l;z++){//注意层数循环在最外面
        for(int x=0;x<m;x++){//行循环
            for(int y=0;y<n;y++){//列循环
                    scanf("%d",&matrix[z][x][y]);
            }
        }
     }
    for(int z=0;z<l;z++){
        for(int x=0;x<m;x++){
            for(int y=0;y<n;y++){
                if(matrix[z][x][y]==1&&inq[z][x][y]==0){
                    //该位为1且未如果队列,说明找到新块
                    BFS(x,y,z);//遍历新块,计算1的个数并标记值1的位为已入队
                }
            }
        }
    }
    printf("%d",ans);//输出最终结果
    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
资源包主要包含以下内容: ASP项目源码:每个资源包中都包含完整的ASP项目源码,这些源码采用了经典的ASP技术开发,结构清晰、注释详细,帮助用户轻松理解整个项目的逻辑和实现方式。通过这些源码,用户可以学习到ASP的基本语法、服务器端脚本编写方法、数据库操作、用户权限管理等关键技术。 数据库设计文件:为了方便用户更好地理解系统的后台逻辑,每个项目中都附带了完整的数据库设计文件。这些文件通常包括数据库结构图、数据表设计文档,以及示例数据SQL脚本。用户可以通过这些文件快速搭建项目所需的数据库环境,并了解各个数据表之间的关系和作用。 详细的开发文档:每个资源包都附有详细的开发文档,文档内容包括项目背景介绍、功能模块说明、系统流程图、用户界面设计以及关键代码解析等。这些文档为用户提供了深入的学习材料,使得即便是从零开始的开发者也能逐步掌握项目开发的全过程。 项目演示与使用指南:为帮助用户更好地理解和使用这些ASP项目,每个资源包中都包含项目的演示文件和使用指南。演示文件通常以视频或图文形式展示项目的主要功能和操作流程,使用指南则详细说明了如何配置开发环境、部署项目以及常见问题的解决方法。 毕业设计参考:对于正在准备毕业设计的学生来说,这些资源包是绝佳的参考材料。每个项目不仅功能完善、结构清晰,还符合常见的毕业设计要求和标准。通过这些项目,学生可以学习到如何从零开始构建一个完整的Web系统,并积累丰富的项目经验。
资源包主要包含以下内容: ASP项目源码:每个资源包中都包含完整的ASP项目源码,这些源码采用了经典的ASP技术开发,结构清晰、注释详细,帮助用户轻松理解整个项目的逻辑和实现方式。通过这些源码,用户可以学习到ASP的基本语法、服务器端脚本编写方法、数据库操作、用户权限管理等关键技术。 数据库设计文件:为了方便用户更好地理解系统的后台逻辑,每个项目中都附带了完整的数据库设计文件。这些文件通常包括数据库结构图、数据表设计文档,以及示例数据SQL脚本。用户可以通过这些文件快速搭建项目所需的数据库环境,并了解各个数据表之间的关系和作用。 详细的开发文档:每个资源包都附有详细的开发文档,文档内容包括项目背景介绍、功能模块说明、系统流程图、用户界面设计以及关键代码解析等。这些文档为用户提供了深入的学习材料,使得即便是从零开始的开发者也能逐步掌握项目开发的全过程。 项目演示与使用指南:为帮助用户更好地理解和使用这些ASP项目,每个资源包中都包含项目的演示文件和使用指南。演示文件通常以视频或图文形式展示项目的主要功能和操作流程,使用指南则详细说明了如何配置开发环境、部署项目以及常见问题的解决方法。 毕业设计参考:对于正在准备毕业设计的学生来说,这些资源包是绝佳的参考材料。每个项目不仅功能完善、结构清晰,还符合常见的毕业设计要求和标准。通过这些项目,学生可以学习到如何从零开始构建一个完整的Web系统,并积累丰富的项目经验。
Acute3D Viewer是一款用于查看Acute3D软件生成的三维模型的软件。以下是Acute3D Viewer的安装教程。 第一步,打开Acute3D Viewer的安装文件,双击运行该文件。 第二步,选择您要将Acute3D Viewer安装到的目标文件夹。您可以选择默认目标文件夹,也可以自定义目标文件夹。点击“下一步”继续。 第三步,选择开始菜单文件夹。您可以选择将Acute3D Viewer的快捷方式添加到开始菜单的默认文件夹,也可以选择创建一个新的文件夹。点击“下一步”继续。 第四步,选择额外任务。您可以选择添加Acute3D Viewer的桌面快捷方式和快速启动图标。点击“下一步”继续。 第五步,选择安装类型。您可以选择完全安装或者自定义安装。如果您对安装过程不了解,建议选择默认安装。点击“下一步”继续。 第六步,点击“安装”按钮开始安装Acute3D Viewer。安装过程可能需要一些时间,请耐心等待。 第七步,等待安装完成。安装完成后,您可以选择打开Acute3D Viewer。 第八步,启动Acute3D Viewer。在启动Acute3D Viewer之前,系统可能会提示您选择连接Acute3D Viewer的3D模型文件的默认应用程序。您可以选择Acute3D Viewer作为默认应用程序,然后单击“确定”。 这样,您就成功地安装了Acute3D Viewer。现在,您可以使用Acute3D Viewer来查看和浏览Acute3D软件生成的三维模型了。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值