0

私は掃海艇を書かなければなりません。隣接するインデックスをチェックして、範囲外に出ずに現在のインデックスを囲む爆弾の数を数える方法を見つけました。しかし、それは長く、醜く、おそらく非効率的です。これらは、範囲外に到達する可能性のある一意のセルごとに一連の条件ステートメントにすぎません。私の質問は、これを行うためのより短い方法はありますか? そして、1次元のワープアラウンド配列を実装すると、それが簡単/難しくなりますか?

int count = 0;
for (int i = 0; i < WIDTH; i++){
    for (int j = 0; j < HEIGHT; j++){
        **// index 0,0**
        if (i == 0 && j == 0 && field[i][j] != 10){
            if (field[i][j + 1] == 10)
                count++;
            if (field[i + 1][j] == 10)
                count++;
            if (field[i + 1][j + 1] == 10)
                count++;
        }
        **// index 0,9**
        else if (i == 0 && j == HEIGHT - 1 && field[i][j] != 10){
            if (field[i][j - 1] == 10)
                count++;
            if (field[i + 1][j - 1] == 10)
                count++;
            if (field[i + 1][j] == 10)
                count++;
        }

        **// index 9,0**
        else if (i == WIDTH - 1 && j == 0 && field[i][j] != 10){
            if (field[i - 1][j] == 10)
                count++;
            if (field[i][j + 1] == 10)
                count++;
            if (field[i - 1][j + 1] == 10)
                count++;
        }

        **// index 9,9**
        else if (i == WIDTH - 1 && j == HEIGHT - 1 && field[i][j] != 10){
            if (field[i - 1][j] == 10)
                count++;
            if (field[i][j - 1] == 10)
                count++;
            if (field[i - 1][j - 1] == 10)
                count++;
        }

        **// if first row**
        else if (i == 0 && (j != 0 && j != HEIGHT - 1) && field[i][j] != 10){
            if (field[i][j - 1] == 10)
                count++;
            if (field[i + 1][j - 1] == 10)
                count++;
            if (field[i + 1][j] == 10)
                count++;
            if (field[i + 1][j + 1] == 10)
                count++;
            if (field[i][j + 1] == 10)
                count++;
        }

        **// if last row**
        else if (i == WIDTH - 1 && (j != 0 && j != HEIGHT - 1) && field[i][j] != 10){
            if (field[i][j - 1] == 10)
                count++;
            if (field[i - 1][j - 1] == 10)
                count++;
            if (field[i - 1][j] == 10)
                count++;
            if (field[i - 1][j + 1] == 10)
                count++;
            if (field[i][j + 1] == 10)
                count++;
        }

        **// if first col**
        else if (j == 0 && (i != 0 && i != HEIGHT - 1) && field[i][j] != 10){
            if (field[i - 1][j] == 10)
                count++;
            if (field[i - 1][j + 1] == 10)
                count++;
            if (field[i][j + 1] == 10)
                count++;
            if (field[i + 1][j] == 10)
                count++;
            if (field[i + 1][j + 1] == 10)
                count++;
        }

        **// if last col**
        else if (j == HEIGHT - 1 && (i != 0 && i != WIDTH - 1) && field[i][j] != 10){
            if (field[i - 1][j - 1] == 10)
                count++;
            if (field[i - 1][j] == 10)
                count++;
            if (field[i][j - 1] == 10)
                count++;
            if (field[i + 1][j - 1] == 10)
                count++;
            if (field[i + 1][j] == 10)
                count++;
        }

        **// Cells that are fully surrounded**
        else if (field[i][j] != 10){
            if (field[i - 1][j - 1] == 10)
                count++;
            if (field[i - 1][j] == 10)
                count++;
            if (field[i - 1][j + 1] == 10)
                count++;
            if (field[i][j - 1] == 10)
                count++;
            if (field[i][j + 1] == 10)
                count++;
            if (field[i + 1][j - 1] == 10)
                count++;
            if (field[i + 1][j] == 10)
                count++;
            if (field[i + 1][j + 1] == 10)
                count++;
        }


        if (field[i][j] != 10)
            field[i][j] = count;
        count = 0;
    }
}
4

1 に答える 1

2

このような状況に対処する標準的な方法があります - 有効な動きで配列を定義し、それを反復処理します。以下は、隣接する 8 つのセルを反復処理する方法の例です。

static int moves[8][2] = {{-1,0}, {-1, -1}, {0, -1}, {1, -1}, {1, 0}, {1, 1}, {0, 1}, {-1, 1}};
for (int i = 0; i < WIDTH; i++) {
    for (int j = 0; j < HEIGHT; j++) {
      for (int l = 0; l < 8 /*sizeof(move) / sizeof(move[0]) */; ++l) {
        int ti = i + move[l][0];
        int tj = j + move[l][1];
        if (ti < 0 || ti >= WIDTH || tj < 0 || tj >= HEIGHT) {
          continue;
        }
        // cell (ti, tj) is valid neighbor do something with it.
      }
    }
}
于 2014-02-23T06:50:13.403 に答える