扫雷
时间限制:C/C++/Rust/Pascal 3秒,其他语言6秒
空间限制:C/C++/Rust/Pascal 256 M,其他语言512 M
64bit IO Format: %lld

题目描述

\hspace{15pt}旺仔哥哥非常喜欢玩扫雷。现在给定一个初始的扫雷矩阵,其中用字符 `*` 表示雷,用 `.` 表示空白。
\hspace{15pt}请你生成完整的扫雷矩阵。对于每个非雷格子,输出它周围八个方向中雷的个数;如果当前位置是雷,则仍输出 `*`。

【名词解释】
\hspace{15pt}: 用 `*` 表示的地雷;
\hspace{15pt}邻格: 与当前位置在八个方向上相邻的格子;
\hspace{15pt}完整扫雷矩阵: 填写完相应数字后的矩阵。

输入描述:

\hspace{15pt}在一行中输入两个整数 n,m \left(1 \leqq n,m \leqq 1000\right),分别表示矩阵的行数和列数。 
\hspace{15pt}接下来 n 行,每行包含 m 个字符,每个字符是 `*` 或 `.`,无空格分隔,表示初始的扫雷矩阵。

输出描述:

\hspace{15pt}输出 nm 列,表示完整的扫雷矩阵。对于每个位置: 

\hspace{23pt}\bullet\,如果该位置是雷,输出 `*`;
\hspace{23pt}\bullet\,否则输出一个数字,该数字等于该位置周围八个邻格中雷的个数。
示例1

输入

复制
4 4
....
..**
*.*.
.*.*

输出

复制
0122
13**
*4*4
2*3*

说明

\hspace{8pt}\bullet\,第一行 `....` 中没有雷,对应 `0122`; 
\hspace{8pt}\bullet\,第二行 `..**` 中两个雷,对应 `13**`;
\hspace{8pt}\bullet\,第三行 `*.*.` 中除自身外有 4 个雷邻格,对应 `*4*4`;
\hspace{8pt}\bullet\,第四行 `.*.*` 对应 `2*3*`。
示例2

输入

复制
3 5
*...*
.....
.*.*.

输出

复制
*101*
22222
1*2*1

说明

\hspace{8pt}\bullet\,第一行 `*...*`:两个雷分别在两端,对应 `*101*`; 
\hspace{8pt}\bullet\,第二行 `.....`:无雷,对应 `22222`;
\hspace{8pt}\bullet\,第三行 `.*.*.`:两个雷对中间格子有 2 个邻雷,对应 `1*2*1`。