幅優先探索

Contents

実装例

priority_queue

コストの小さい方から優先的に探索する為にpriority_queueを用いる。

// cost, y, xの順
using tup = tuple<ll, int, int>;
priority_queue<tup, vector<tup>, greater<tup>> q;

// スタート地点を追加
q.emplace(0, sy, sx);

while (!q.empty()) {
  auto t = q.top();
  q.pop();
  ll c = get<0>(t);
  int y = get<1>(t);
  int x = get<2>(t);

  // q.emplace(c + 1, ny, nx);
}

上下左右の探索

各方向への移動をまとめて処理する為のテクニック。

constexpr int dy[4] = {0, 0, -1, +1};
constexpr int dx[4] = {-1, +1, 0, 0};

rep(i, 4) {
  int ny = y + dy[i];
  int nx = x + dx[i];
  if (ny < 0 || ny >= h)
    continue;
  if (nx < 0 || nx >= w)
    continue;

  // do something
}

8方向の探索

for (int ny = y - 1; ny <= y + 1; ny++) {
  if (ny < 0 || ny >= h)
    continue;

  for (int nx = x - 1; nx <= x + 1; nx++) {
    if (nx < 0 || nx >= w)
      continue;

    // do something
  }
}

関連問題