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
}
}