问题链接:CCF NOI1054 扫雷游戏。
时间限制: 1000 ms 空间限制: 262144 KB
题目描述
扫雷游戏是一款十分经典的单机小游戏。它的精髓在于,通过已翻开格子所提示的周围格地雷数,来判断未翻开格子里是否是地雷。
现在给出n行m列的雷区中的地雷分布,要求计算出每个非地雷格的周围格地雷数。
注:每个格子周围格有八个:上、下、左、右、左上、右上、左下、右下。
输入
第一行包含两个整数n和m,分别表示雷区的行数和列数。1 <= n <= 100, 1 <= m <= 100。
接下来n行,每行m个字符,‘*’表示相应格子中是地雷,‘?’表示相应格子中无地雷。字符之间无任何分隔符。
输出
n行,每行m个字符,描述整个雷区。若相应格中是地雷,则用‘*’表示,否则用相应的周围格地雷数表示。字符之间无任何分隔符。
样例输入
3 3
*??
???
?*?
样例输出
*10
221
1*1
1 <= n <= 100, 1 <= m <= 100。
问题分析
扫雷游戏是人们熟知的一个计算机游戏,通过这个程序,可以了解其局部的计算是如何实现的。
这是一个简单的计算问题,对于一个位置,直接计算其周围的地雷数量即可。
程序说明
定义二维数组用于存储扫雷游戏的棋盘时,周围多出一圈,可以省去数组下标的越界判定。
这里给出两种计算地雷数量的方法,分别编写程序。
参考链接:(略)。
100分通过的C语言程序之一:
#include
#include
struct _around {
int drow;
int dcol;
} around[] = {{-1, -1}, {-1, 0}, {-1, 1}, {0, 1}, {1, 1}, {1, 0}, {1, -1}, {0, -1}};
#define AN 8
#define N 100
char a[N+2][N+2];
int main(void)
{
int n, m, i, j, k;
memset(a, 0, sizeof(a));
scanf("%d%d", &n, &m);
for(i=1; i<=n; i++)
scanf("%s", a[i]+1);
for(i=1; i<=n; i++) {
for(j=1; j<=m; j++) {
int count = 0;
if(a[i][j] == '*')
printf("%c", a[i][j]);
else {
for(k=0; k
100分通过的C语言程序之二:
#include
struct _around {
int drow;
int dcol;
} around[] = {{-1, -1}, {-1, 0}, {-1, 1}, {0, 1}, {1, 1}, {1, 0}, {1, -1}, {0, -1}};
#define AN 8
#define N 100
char a[N+2][N+2];
int main(void)
{
int n, m, i, j, k;
scanf("%d%d", &n, &m);
for(i=1; i<=n; i++)
scanf("%s", a[i]+1);
for(i=1; i<=n; i++)
for(j=1; j<=m; j++)
if(a[i][j] != '*')
a[i][j] = 0;
for(i=1; i<=n; i++)
for(j=1; j<=m; j++)
if(a[i][j] == '*')
for(k=0; k