[PAT解题报告] Acute Stroke

给定一个脑平面图,其实是一个分层的长方体图,每一层是一个长方形,1表示有问题,0表示没问题。先求有问题的连通分量,如果size大于一个阈值就记入总的有问题的size。最后求总体有问题的size是多少。
关键是规模很大,dfs似乎会堆栈溢出或者超时,所以改用bfs,写起来没有dfs舒服——要自己搞队列。60层,每层是1286 * 128的,三个维度不同。可以压入到一个int里,最后一维占8bit,中间那维我占了12bit,其实11bit就够了,我只是觉得后两维占20bit比较整……,所以还是用位运算压入一个int代替存放3个不同的int……

代码:
#include <cstdio>
#include <string>
#include <cstring>
#include <queue>
using namespace std;

int m,n,t;

int a[66][1290][130];
const int dc[] = {-1,1,0,0,0,0};
const int dx[] = {0,0,-1,1,0,0};
const int dy[] = {0,0,0,0,-1,1};

queue<int> q;
int bfs(int c,int x,int y) {
    if (a[c][x][y] == 0) {
        return 0;
    }
    a[c][x][y] = 0;
    q.push((c << 20) | (x << 8) | y);
    int r = 1;
    for (;!q.empty(); q.pop()) {
        int c = q.front() >> 20;
        int x = (q.front() >> 8) & 4095;
        int y = q.front() & 255;
        for (int i = 0; i < 6; ++i) {
            int cc = c + dc[i], xx = x + dx[i], yy = y + dy[i];
            if ((cc >= 0) && (cc < t) && (xx >= 0) && (xx < m) && (yy >= 0) && (yy < n) && a[cc][xx][yy]) {
                ++r;
                a[cc][xx][yy] = 0;
                q.push((cc << 20) | (xx << 8) | yy);
            }
        }
    }
    return r;
}

int main() {
int d;
    scanf("%d%d%d%d",&m, &n, &t,&d);
    for (int i = 0; i < t; ++i) {
        for (int j = 0; j < m; ++j) {
            for (int k = 0; k < n; ++k) {
                scanf("%d",&a[i][j][k]);
            }
        }
    }
    int answer = 0;
    for (int i = 0; i < t; ++i) {
        for (int j = 0; j < m; ++j) {
            for (int k = 0; k < n; ++k) {
                int v = bfs(i, j, k);
                if (v >= d) {
                    answer += v;
                }
            }
        }
    }
    printf("%d\n",answer);
    return 0;
}
原题链接: http://www.patest.cn/contests/pat-a-practise/1091
全部评论

相关推荐

点赞 收藏 评论
分享
牛客网
牛客企业服务