回答編集履歴

1 コード間違いを訂正

KSwordOfHaste

KSwordOfHaste score 18166

2017/02/28 00:35  投稿

コードでは何もない場所P1に隣接したセルP2を開けたらそこも「何もない」ときP2を新たな基準と考えてその周りの8セルを開けるというのがうまく表現できていないと思います。
この例の場合は再帰アルゴリズムを使うと素直にやりたいことが表現できる気がします。
```java
void openCell(int x, int y) {
 if (x < 0 || w >= width || y < 0 || y >= height)
   //範囲外の時は何もしない
   return;
 if (isOpened(x, y))
   //既に開かれていたら何もしない
   return;
 if (isBomb(x, y))
   throw new BombException("残念でした");
 if (getCellNumber(x, y) == 0) {
   // まわりに爆弾が一つもなかったら・・・
   for (int ny = y - 1; ny <= y + 1; ny++) {
      for (int nx = x - 1; nx <= x + 1; nx++) {
        openCell(x - 1, y - 1); // 再帰呼び出し
        openCell(nx, ny); // 再帰呼び出し
      }
   }
 }
}
```
```
追記:肝心の再帰呼び出しのところの引数が間違ってたので訂正しました。

思考するエンジニアのためのQ&Aサイト「teratail」について詳しく知る