問題
Annotate a rectangular board. A star (*) is a mine and a dot (.) is a safe cell. For each safe cell, count mines in the eight surrounding cells, including diagonals. Replace it with the count from 1 to 8, or keep a dot if the count is zero. Preserve every mine. Cells outside the board do not exist.
Implement minesweeper_neighbor_counts(board).
Input
board: The rows from top to bottom; characters run left to right.
Output
Return the annotated rows in the same order and dimensions.
制約
1 ≤ rows, columns ≤ 200. Every row has the same nonzero length and contains only * and . .
例
入力:
board = ["*..", "...", "..*"]
期待される出力:
expected = ["*1.", "121", ".1*"]
入力:
std::vector<std::string> board = {"*..", "...", "..*"};
期待される出力:
std::vector<std::string> expected = {"*1.", "121", ".1*"};
入力:
string[] board = new string[] {"*..", "...", "..*"};
期待される出力:
string[] expected = new string[] {"*1.", "121", ".1*"};
解説
The center touches both mines, so its count is 2. The top-right and bottom-left touch none and stay dots. Other safe cells touch one mine.
入力:
board = ["..."]
期待される出力:
expected = ["..."]
入力:
std::vector<std::string> board = {"..."};
期待される出力:
std::vector<std::string> expected = {"..."};
入力:
string[] board = new string[] {"..."};
期待される出力:
string[] expected = new string[] {"..."};
解説
This one-row board has no mines. All counts are zero, so every dot remains a dot.
解き方のヒント
まずは自分で考えてから、ヒントを 1 つずつ開いてみましょう。
ヒント 1
変更するのは安全なマスだけで、地雷はそのまま残します。
ヒント 2
各.について、周囲8マスを見て地雷の数を数えます。
ヒント 3
端や角では、盤面の外を読まないように注意します。
目安の計算量
時間 O(r*c)、追加メモリ O(r*c)
参考資料
この課題はCodeUtility用に調整されています。上記の説明と制約に従ってください。