这种题目乍一看属于读懂了,就会做的类型,只要注意下不要使用递归就可以,但在做的过程中第五个测试点一直过不了,百思不得其解,后来敲了一遍别人的答案,才发现是容器上的一个问题。柳神的参考代码链接
我自己的实现
using namespace std;
int m, n, l, t, vol = 0;
int matrix[70][1300][130];
bool visited[70][1300][130];
int x[] = {0, 0, 0, 0, 1, -1};
int y[] = {0, 0, 1, -1, 0, 0};
int z[] = {1, -1, 0, 0, 0, 0};
struct node {
int x, y, z;
node() = default;
node(int x, int y, int z) : x(x), y(y), z(z) {}
};
void BFS(int i, int j, int k) {
visited[i][j][k] = true;
queue<node> q;
int n_x, n_y, n_z;
q.emplace(i, j, k);
int cnt = 0;
while (!q.empty()) {
++cnt;
auto &e = q.front();
for (int i1 = 0; i1 < 6; ++i1) {
n_x = e.x + x[i1];
n_y = e.y + y[i1];
n_z = e.z + z[i1];
if (n_x >= 0 && n_x < l && n_y >= 0 && n_y < m && n_z >= 0 && n_z < n &&
matrix[n_x][n_y][n_z] == 1 && !visited[n_x][n_y][n_z]) {
q.emplace(n_x, n_y, n_z);
visited[n_x][n_y][n_z] = true;
}
}
q.pop();
}
if (cnt >= t) vol += cnt;
}
在BFS的过程我们频繁使用队列进出操作,如下是一些常见的操作
auto e = q.front(); // ok 这种操作需要调用拷贝函数,如果数据量大可能会被卡时间,
q.pop();
// do something
auto &e = q.front(); // 题目中这种操作使得第五个点没过,我也不清楚是为什么,但是以后尽量避免此类操作
q.pop();
// do something
auto &e = q.front(); // ok 结合效率和正确性的操作,但容器只能为队列,在栈中不能这样操作,中间代码可能又添加新的元素到栈顶
// do something
q.pop();