1091. Acute Stroke (30)

来源:互联网 发布:centos 包管理器 编辑:程序博客网 时间:2024/04/29 13:00

    主要在于理解题意,读了三遍,竟然没懂啥意思尴尬,最后还看了Uncle_Sugar 的解释才明白,真是给这题跪了。实质上是三维空间走一遍DFS或者BFS,统计一下连通区域中1的个数,其中如果一个连通区域1的个数小于给定阈值则不算进去。

#include <iostream>#include <cstdio>#include <queue>#include <tuple>using namespace std;int graph[1286][128][60];int m, n, l, t;using Point = tuple<int,int,int>;bool valid(Point pt){return get<0>(pt) >= 0 && get<0>(pt) < m && get<1>(pt) >= 0 && get<1>(pt) < n && get<2>(pt) >= 0 && get<2>(pt) < l;}int dx[] = {1, -1, 0,  0, 0,  0};int dy[] = {0,  0, 1, -1, 0,  0};int dz[] = {0,  0, 0,  0, 1, -1};int bfs(Point pt){queue<Point> Q;Q.push(pt);int x,y,z, volume = 0;tie(x,y,z) = pt;graph[x][y][z] = 0;while(!Q.empty()){pt = Q.front(); Q.pop();tie(x,y,z) = pt;volume++;for(int i = 0; i < 6; ++i){int xx = x+dx[i], yy = y+dy[i], zz = z+dz[i];if(valid(make_tuple(xx, yy, zz)) && graph[xx][yy][zz]){graph[xx][yy][zz] = 0;Q.push(make_tuple(xx, yy, zz));}}}return volume >= t ? volume : 0;}int main(){scanf("%d%d%d%d", &m, &n, &l, &t);for(int k = 0 ; k < l; ++k){for(int i = 0; i < m; ++i){for(int j = 0; j < n; ++j){scanf("%d", &graph[i][j][k]);}}}int total = 0;for(int k = 0 ; k < l; ++k){for(int i = 0; i < m; ++i){for(int j = 0; j < n; ++j){if(graph[i][j][k]){total += bfs(make_tuple(i, j, k));}}}}printf("%d", total);return 0;}


0 0
原创粉丝点击