PAT A1091 Acute Stroke

对于坐标平面的bfs模板题~

#include<bits/stdc++.h>
using namespace std;
const int maxn=1010;
bool visit[1300][130][80]={false};
int adj[1300][130][80];
int n,m,l,K;
int X[6]={1,0,0,-1,0,0};
int Y[6]={0,1,0,0,-1,0};
int Z[6]={0,0,1,0,0,-1};
struct node {
    int x,y,z;
};
bool judge (int x,int y,int z) {
    if (x>=n||x<0||y>=m||y<0||z>=l||z<0) 
    return false;
    if (adj[x][y][z]==0) return false;
    if (visit[x][y][z]==true) return false;
    return true;
}
int bfs (int x,int y,int z) {
    queue<node> q;
    q.push({x,y,z});
    int cnt=0;
    visit[x][y][z]=true;
    while (!q.empty()) {
        node now=q.front();
        q.pop();
        cnt++;
        for (int i=0;i<6;i++) {
            int tx=now.x+X[i];
            int ty=now.y+Y[i];
            int tz=now.z+Z[i];
            if (judge(tx,ty,tz)) {
                q.push({tx,ty,tz});
                visit[tx][ty][tz]=true;
                //cnt++;
            }
        }
    }
    if (cnt>=K) return cnt;
    return 0;
}
int main () {
    scanf ("%d %d %d %d",&n,&m,&l,&K);
    for (int i=0;i<l;i++) 
    for (int j=0;j<n;j++)
    for (int k=0;k<m;k++)
    scanf ("%d",&adj[j][k][i]);
    int cnt=0;
    for (int i=0;i<l;i++)
    for (int j=0;j<n;j++)
    for (int k=0;k<m;k++)
    if (visit[j][k][i]==false&&adj[j][k][i]==1) cnt+=bfs(j,k,i);
    printf ("%d\n",cnt);
    return 0;
}

 

posted @ 2020-02-12 22:59  zlc0405  阅读(96)  评论(0编辑  收藏  举报