提示后人
查看原帖
提示后人
477758
maka_baka楼主2025/1/7 17:42

我按照 mulberror 的题解做这题时写出了 3 个 bug:

  • bfs 不要写假了,队列可能要开 8N8N,因为一个点可能 8 次重复入队(视实现方法确定)。
  • check 里要判断 couldrm
  • 如果你用二进制编码方向,取第 2 位是和 2 位与 x&0b10,取低 2 位是和 3 位与 x&0b11
bool couldrm(int i) {
  // 如果当前局面能一次删掉颜色是 i 的棋子
  return true;
}

void check(int x, int y) {
  // 从队列头取出 i,从颜色为 i 的 2 颗棋子更新
  for (int w=0; w<4; w++) {
    int i = get(x, y, w);
    if (~i && couldrm(i)) qu[tl++] = i;
  }
}

int main() {
  // ...
  while (hd < tl) {
    int i = qu[hd++];
    if (ip[i]) remove(i);
    else continue;
    check(x1[i], y1[i]);
    check(x2[i], y2[i]);
  }
  // ...
}
2025/1/7 17:42
加载中...