Have you ever played Minesweeper? It’s a cute little game which comes within a certain Operating System which name we can’t really remember. Well, the goal of the game is to find where are all the mines within a M × N field. To help you, the game shows a number in a square which tells you how many mines there are adjacent to that square. For instance, supose the following 4 × 4 field with 2 mines (which are represented by an ‘*’ character):
*...
....
.*..
....
If we would represent the same field placing the hint numbers described above, we would end up with:
*100
2210
1*10
1110
As you may have already noticed, each square may have at most 8 adjacent squares.
Input
The input will consist of an arbitrary number of fields. The first line of each field contains two integers n and m (0 < n, m ≤ 100) which stands for the number of lines and columns of the field respectively. The next n lines contains exactly m characters and represent the field.
Each safe square is represented by an ‘.’ character (without the quotes) and each mine square is represented by an ‘*’ character (also without the quotes). The first field line where n = m = 0 represents the end of input and should not be processed.
Output
For each field, you must print the following message in a line alone:
Field #x:
Where x stands for the number of the field (starting from 1). The next n lines should contain the field with the ‘.’ characters replaced by the number of adjacent mines to that square. There must be an empty line between field outputs.
Sample Input
4 4
*...
....
.*..
....
3 5
**...
.....
.*...
0 0
Sample Output
Field #1:
*100
2210
1*10
1110
Field #2:
**100
33200
1*100
问题链接:UVA10189 Minesweeper
问题简述:(略)
问题分析:扫雷游戏是人们熟知的一个计算机游戏,通过这个程序,可以了解其局部的计算是如何实现的。
这是一个简单的计算问题,对于一个位置,直接计算其周围的地雷数量即可。
程序说明:
定义二维数组用于存储扫雷游戏的棋盘时,周围多出一圈,可以省去数组下标的越界判定。
数组around[]存储周围元素的相对下标,使得无序变有序,可以用循环来处理。题记:(略)
参考链接:(略)
/* UVA10189 Minesweeper */
#include <stdio.h>
#include <string.h>
#define AN 8
struct _around {
int drow;
int dcol;
} around[] = {{-1, -1}, {-1, 0}, {-1, 1}, {0, 1}, {1, 1}, {1, 0}, {1, -1}, {0, -1}};
#define N 100
char a[N+2][N+2];
int main(void)
{
int n, m, i, j, k, caseno=0;
while(~scanf("%d%d", &n, &m) && (n || m)) {
memset(a, 0, sizeof(a));
for(i=1; i<=n; i++)
scanf("%s", a[i]+1);
if(caseno)
printf("\n");
printf("Field #%d:\n", ++caseno);
for(i=1; i<=n; i++) {
for(j=1; j<=m; j++) {
int count = 0;
if(a[i][j] != '*') {
for(k=0; k<AN; k++)
if(a[i + around[k].drow][j + around[k].dcol] == '*')
count++;
a[i][j] = count + '0';
}
}
}
for(i=1; i<=n; i++)
printf("%s\n", a[i] + 1);
}
return 0;
}