Minesweeper is a game played on a R × C rectangular board. Some of the cells contain mines, andothers are empty. For each empty cell, calculate the number of its adjacent cells that contain mines.Two cells are adjacent if they share a common edge or point. This means that each cell has a maximumof 8 neighbors (up, down, left, right, four diagonals).
Input
There will be multiple test cases. The first line of each test case will have two integers, R and C(1 ≤ R, C ≤ 100), indicating the number of rows and columns of the board. The next R lines eachcontain exactly C characters. Each character is either a ‘*’ (asterisk) indicating a mine, or a ‘.’ (period)indicating an empty cell. The last data set is followed by a line containing two ‘0’s.
Output
Print each board on R lines with C characters per line, and replace every ‘.’ with the appropriate digitindicating the number of adjacent cells that contain mines. Leave the ‘*’ cells intact. Do not print anywhitespace between cells. Do not print any blank lines between answers.
Sample Input
3 2
..
.*
..
5 5
*.*.*
..*..
*****
.....
..**.
0 0
Sample Output
11
1*
11
*3*3*
36*63
*****
24553
01**1
Regionals 2009 >> North America - Southeast USA
问题简述:(略)
问题分析:扫雷游戏是人们熟知的一个计算机游戏,通过这个程序,可以了解其局部的计算是如何实现的。
这是一个简单的计算问题,对于一个位置,直接计算其周围的地雷数量即可。
程序说明:
定义二维数组用于存储扫雷游戏的棋盘时,周围多出一圈,可以省去数组下标的越界判定。
数组around[]存储周围元素的相对下标,使得无序变有序,可以用循环来处理。题记:(略)
参考链接:(略)
/* UVALive4604 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 r, c, i, j, k;
while(~scanf("%d%d", &r, &c) && (r || c)) {
memset(a, 0, sizeof(a));
for(i=1; i<=r; i++)
scanf("%s", a[i]+1);
for(i=1; i<=r; i++) {
for(j=1; j<=c; 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<=r; i++)
printf("%s\n", a[i] + 1);
}
return 0;
}