扫雷艇 你玩过扫雷吗?这个可爱的小游戏带有某个操作系统,我们不记得它的名字了。游戏的目标是找到所有地雷在M x N场内的位置。 游戏在一个正方形中显示一个数字,告诉您该正方形附近有多少地雷。每个方块最多有八个相邻的方块。左侧的 4 x 4 字段包含两个地雷,每个地雷由“*”字符表示。如果我们用上面描述的提示数字表示相同的字段,我们最终会在右侧得到字段: … … .… … 100 2210 110 1110
输入将由任意数量的字段组成。每个字段的第一行包含两个整数 n 和 m ( 0 < n, m$ \le$100),分别代表字段的行数和列数。接下来的 n 行中的每一行都恰好包含 m 个字符,表示字段。安全方块用“.”表示,地雷方块用“*”表示,两者都没有引号。n = m = 0 的第一字段行表示输入的结束,不应进行处理。
对于每个字段,仅在一行上打印消息字段 #x:,其中 x 代表从 1 开始的字段编号。接下来的 n 行应包含带有“.”字符的字段,替换为与该方块相邻的地雷数。字段输出之间必须有空行。
4 4
…
…
.…
…
3 5
**…
…
.*…
0 0
Field #1:
100
2210
110
1110
Field #2:
**100
33200
1*100
#include
using namespace std;
int main(){
int lie = 0;
int hang = 0;
int num = 0;
while(cin >> hang >> lie && hang!=0 && lie!=0) {
char road[hang][lie];
for (int i = 0; i < hang; i++) {
for (int j = 0; j < lie; j++) {
cin >> road[i][j];
}
}
int road2[hang][lie];
memset(road2, 0, sizeof(road2)); //初始化0
for (int i = 0; i < hang; i++) {
for (int j = 0; j < lie; j++) {
if (road[i][j] == '*') {
road2[i][j] = -1;
if (i - 1 >= 0 && road[i - 1][j] != '*') {
road2[i - 1][j]++;
}
if (i + 1 <= hang && road[i + 1][j] != '*') {
road2[i + 1][j]++;
}
if (j - 1 >= 0 && road[i][j - 1] != '*') {
road2[i][j - 1]++;
}
if (j + 1 <= lie && road[i][j + 1] != '*') {
road2[i][j + 1]++;
}
if (i - 1 >= 0 && j - 1 >= 0 && road[i - 1][j - 1] != '*') {
road2[i - 1][j - 1]++;
}
if (i - 1 >= 0 && j + 1 <= hang && road[i - 1][j + 1] != '*') {
road2[i - 1][j + 1]++;
}
if (i + 1 <= lie && j + 1 <= hang && road[i + 1][j + 1] != '*') {
road2[i + 1][j + 1]++;
}
if (i + 1 <= lie && j - 1 >= 0 && road[i + 1][j - 1] != '*') {
road2[i + 1][j - 1]++;
}
}
}
}
num ++;
cout << "Field #" << num << ":" <<endl;
for (int i = 0; i < hang; i++) {
for (int j = 0; j < lie; j++) {
if (road2[i][j] != -1) {
cout << road2[i][j];
} else {
cout << "*";
}
}
cout << endl;
}
cout << endl;
}
}