hotarunx's diary

競プロとゲームをしていません

競プロの上下左右方向を表すときに構造化束縛を使った - DYDX

競プロでグリッド上のマスの上下左右方向を見るときint DY[4] = {1, 0, -1, 0};みたいな配列が使われます。 今回は構造化束縛で書いてみました。

構造化束縛するやつ

    constexpr array<pair<int, int>, 4> DYDX = {make_pair(1, 0), make_pair(0, 1), make_pair(-1, 0), make_pair(0, -1)};
    for (auto &[y, x] : DYDX) {
        cout << y << " " << x << "\n";
    }
1 0
0 1
-1 0
0 -1

for文まわりが簡潔になるのが長所かと思います。

比較のためよく見る配列DY, DXをつかうやつと1配列で表すやつを紹介します。

配列DY, DXをつかうやつ

よく見るやつです。

    constexpr array<int, 4> DY = {1, 0, -1, 0};
    constexpr array<int, 4> DX = {0, 1, 0, -1};
    for (int i = 0; i < 4; i++) {

        const int y = DY[i], x = DX[i] ;
        cout << y << " " << x << "\n";
    }
1 0
0 1
-1 0
0 -1

DY, DXを1配列で表すやつ

このプレゼンで見ました。 hackmd.io

    constexpr array<int, 5> D = {0, 1, 0, -1, 0};
    for (int i = 0; i < 4; i++) {

        const int x = D[i], y = D[i + 1];
        cout << y << " " << x << "\n";
    }
1 0
0 1
-1 0
0 -1