PAT 甲级 1091 第五个测试点被卡

这种题目乍一看属于读懂了,就会做的类型,只要注意下不要使用递归就可以,但在做的过程中第五个测试点一直过不了,百思不得其解,后来敲了一遍别人的答案,才发现是容器上的一个问题。柳神的参考代码链接

我自己的实现

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();
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值