ハッカーランキング-春のスーパーマンゲーム


The Bomberman Game (2021. 08. 11)


質問と回答アドレス


HackerRank
Git Solution

質問の説明-英語


Bomberman lives in a rectangular grid. Each cell in the grid either contains a bomb or nothing at all.
Each bomb can be planted in any cell of the grid but once planted, it will detonate after exactly 3 seconds. Once a bomb detonates, it's destroyed — along with anything in its four neighboring cells. This means that if a bomb detonates in cell , any valid cells (i±1,j) and (i,j±1) are cleared. If there is a bomb in a neighboring cell, the neighboring bomb is destroyed without detonating, so there's no chain reaction.
Bomberman is immune to bombs, so he can move freely throughout the grid. Here's what he does:
Initially, Bomberman arbitrarily plants bombs in some of the cells, the initial state.
After one second, Bomberman does nothing.
After one more second, Bomberman plants bombs in all cells without bombs, thus filling the whole grid with bombs. No bombs detonate at this point.
After one more second, any bombs planted exactly three seconds ago will detonate. Here, Bomberman stands back and observes.
Bomberman then repeats steps 3 and 4 indefinitely.
Note that during every second Bomberman plants bombs, the bombs are planted simultaneously (i.e., at the exact same moment), and any bombs planted at the same time will detonate at the same time.
Given the initial configuration of the grid with the locations of Bomberman's first batch of planted bombs, determine the state of the grid after seconds.
For example, if the initial grid looks like:

問題の説明-翻訳


Bombermanは矩形メッシュに住んでいます.グリッド内の各セルに爆弾が含まれているか、含まれていません.
各爆弾はグリッドのすべてのセルに取り付けることができますが、いったん取り付けると爆弾は3秒後に爆発します.爆弾が爆発すると、4つの隣接するユニットのすべてのものと一緒に破壊されます.すなわち、爆弾が細胞中で爆発すると、すべての有効なユニット(i±1,j)および(i,j±1)が除去される.隣の団地に爆弾があれば、隣の爆弾は爆発せず、破壊されるので、連鎖反応はありません.
Bombermanは爆弾に免疫しているので、グリッド全体を自由に移動することができます.彼の仕事は以下の通りです.
初期には、Bombermanは初期状態の細胞に爆弾をランダムに装着した.
  • 1秒後、Bombermanは何もしなかった.
  • 1秒後、Bombermanはすべてのユニットに爆弾を取り付け、爆弾でグリッド全体を埋め尽くした.爆弾は爆発しない.
  • あと
  • 1秒で、正確には3秒前に取り付けられた爆弾が爆発します.ここで,Bombermanは後退して観察した.
  • 次いで、Bombermanは、ステップ3およびステップ4を無期限に反復する.毎秒Bombermanが爆弾を装着すると、爆弾が同時に装着され(すなわち、正確には同じ時刻)、同時に装着された爆弾が同時に爆発する.
    Bombermanの最初の爆弾配置位置とグリッドの初期構成が一緒になると、秒.
    せいげんじょうけん

    トラブルシューティング


    英語なので、問題を理解するのに一番時間がかかるようです.問題の例を挙げると、爆弾は時間とともに変化し、形状の変化は規則的で、すべての時間を計算する必要はないことが分かった.毎回変化する形状をどのように分配処理するかを考えるとList 컬렉션에서 set메소드(更新)があるのでそれを使ってみます.(実際に仕事で使ったこともないので、そのまま応用しましょう)

    ≪イベント|Events|ldap≫


    計算を3 X 3形式で行う場合は、初期バージョンと爆弾爆発のバージョンを説明するだけで、全て爆弾で埋まったバージョンの計3種類で済みます.2の排水時間では、充填された爆弾なのか、元のバージョンなのか爆発したバージョンなのかよく考えられます.
    1   5   9    13    17 # 최초 폭탄버전
      3   7   11    15    # 1차폭발이후 폭탄버전
    4の残りの値が1の場合と3の場合で判別すればよいようです.しかし、テストケースでは失敗しました.これは初期バージョンのモードではありません.(テストは3 x 3...)
    エラーのテストケースは次のとおりです.
    # 초기 버전
    .......
    ...O.O.
    ....O..
    ..O....
    OO...OO
    OO.O...
    # 1차 폭발 버전
    OOO.O.O
    OO.....
    OO....O
    .......
    .......
    .......
    # 2차 폭발 버전
    .......
    ...O.O.
    ...OO..
    ..OOOO.
    OOOOOOO
    OOOOOOO
    見えますか、、、、初期バージョンと2回目の爆発バージョンはあまりにも違います.この問題を知らないで、私は間違った問題を理解したと思って、また時間を費やしました.

    トラブルシューティング


    爆弾の位置値を探す方法
        private static List<Integer> getIndex(String str) {
            List<Integer> result = new ArrayList<>();
            if(str.contains("O")){
                int i = str.indexOf("O");
                result.add(i);
                while(i >= 0) {
                    i = str.indexOf("O", i+1);
                    if(i > 0){
                        result.add(i);
                    }
                }
            }
            return result;
        }
    爆弾ですべてのエリアを埋める方法
        public static List<String> fillBomber(List<String> grid){
            return grid.stream().map(a -> a.replace(".", "O")).collect(Collectors.toList());
        }
    爆弾爆発時の目標値を変換する方法
        public static String replaceValue(String str, int idx) {
            String[] tempArr = str.split("");
            tempArr[idx] = ".";
            return String.join("",tempArr);
        }
    上下左右Validationと設定値の方法は、爆弾が爆発した時の本人を含む.
  • の範囲を超えている場合は、処理しません.
  • 上下関係ではrowの値のみが変更されるためkey値は±1となる.
  • 程度の関係ではColumnの値のみが変更されるため±1となる.
  •      // up validation & set
        if(key != 0){
            convertGrid.set(key - 1, replaceValue(convertGrid.get(key - 1), val));
        }
        // down validation & set
        if(key != row - 1){
            convertGrid.set(key + 1, replaceValue(convertGrid.get(key + 1), val));
        }
        // left validation & set
        if(val != 0){
            convertGrid.set(key, replaceValue(convertGrid.get(key), val - 1));
        }
        // right validation & set
        if(val != column - 1){
            convertGrid.set(key, replaceValue(convertGrid.get(key), val + 1));
        }
        // center set
        convertGrid.set(key, replaceValue(convertGrid.get(key), val));

    テスト結果



    ポスト


    問題を理解して、上下左右に計算するのに時間がかかりますが、難易度自体は低いです.(一度で解けたから…;)しかし、このような例外をテストケースで教えてくれず、Hiddenに処理されると、恐ろしいことが起こる可能性があります...