PAT甲级-BFS-1091 Acute Stroke解题思路

1091 Acute Stroke (30 分)

在这里插入图片描述
在这里插入图片描述

思路

BFS, 走迷宫必用~

代码

#include<bits/stdc++.h>
using namespace std;

struct node{
    
    
    int x,y,z;
}Node;

int n,m,sl,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>=n || x<0 ||y>=m ||y<0|| z>=sl|| z<0)return false;
    if(pixel[x][y][z]==0 || inq[x][y][z]==true) 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)){
    
    
                Node.x = newX,Node.y = newY,Node.z =newZ;
                Q.push(Node);
                inq[newX][newY][newZ] = true;
            }
        }
    }
    if(tot >= T)return tot;
    else return 0;
}
int main(){
    
    
    scanf("%d%d%d%d",&n,&m,&sl,&T);
    for(int z = 0;z<sl;z++){
    
    
        for(int x=0;x<n;x++){
    
    
            for(int y=0;y<m;y++)
                scanf("%d",&pixel[x][y][z]);
        }
    }

    int ans = 0;
    for(int z =0;z<sl;z++){
    
    
        for(int x=0;x<n;x++){
    
    
            for(int y=0;y<m;y++){
    
    
                if(pixel[x][y][z]==1 && inq[x][y][z]==false ){
    
    
                    ans+=BFS(x,y,z);
                }
            }
        }
    }

    cout<<ans<<endl;

}

猜你喜欢

转载自blog.csdn.net/weixin_43999137/article/details/114734112