A1091 Acute Stroke (30point(s))
题意
在体积为LMN 的三维数组中寻找连续的1组成的块并计算1的数目,要求连续的块应满足1的数目大于K。
思路
广度优先搜索。
总结
一开始觉得递归写起来简洁然后最后有两个直接段错误了,果然这种情况使用递归bfs会栈溢出。
Sample Input:
3 4 5 2
1 1 1 1
1 1 1 1
1 1 1 1
0 0 1 1
0 0 1 1
0 0 1 1
1 0 1 1
0 1 0 0
0 0 0 0
1 0 1 1
0 0 0 0
0 0 0 0
0 0 0 1
0 0 0 1
1 0 0 0
Sample Output:
26
#include"bits/stdc++.h"
using namespace std;
int a[65][1300][130];
int d[6][3] = {
{1,0,0},{-1,0,0},
{0,1,0},{0,-1,0},
{0,0,1},{0,0,-1}
};
int m,n,l,T;
bool is_ok(int i,int j,int k) {
if(i >= l || j >= m || k >= n)
return false;
else if(i < 0 || j < 0 || k < 0)
return false;
return a[i][j][k] == 1;
}
struct Node {
int i,j,k;
};
int bfs(int i,int j,int k) {
queue<Node> q;
q.push(Node {i,j,k});
a[i][j][k] = 0;
int cnt = 0;
while(!q.empty()) {
Node node = q.front();
q.pop();
cnt ++;
for(int t=0; t<6; t++) {
int ti = node.i+d[t][0];
int tj = node.j+d[t][1];
int tk = node.k+d[t][2];
if(is_ok(ti,tj,tk)){
q.push(Node {ti,tj,tk});
a[ti][tj][tk] = 0;
}
}
}
return cnt;
}
int main() {
// freopen("input.txt","r",stdin);
cin >> m >> n >> l >> T;
for(int i=0; i<l; i++) {
for(int j=0; j<m; j++) {
for(int k=0; k<n; k++) {
scanf("%d",&a[i][j][k]);
}
}
}
int ans = 0;
for(int i=0; i<l; i++) {
for(int j=0; j<m; j++) {
for(int k=0; k<n; k++) {
int cnt = 0;
if(is_ok(i,j,k)) cnt = bfs(i,j,k);
if(cnt >= T) ans += cnt;
}
}
}
cout << ans << endl;
}