CCF NOI1054 扫雷游戏
问题链接: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。
问题分析
扫雷游戏是人们熟知的一个计算机游戏,通过这个程序,可以了解其局部的计算是如何实现的。
这是一个简单的计算问题,对于一个位置,直接计算其周围的地雷数量即可。
程序说明
定义二维数组用于存储扫雷游戏的棋盘时,周围多出一圈,可以省去数组下标的越界判定。
这里给出两种计算地雷数量的方法,分别编写程序。
- 先定义一个符号常量,再用它来定义二维数组,可以使得程序的通用性得到提高。
- 一些编程技巧有助于简化程序的代码。
- 函数memset()用于给大量的存储空间设置初始值是方便的。
- 数组around[]存储周围元素的相对下标,使得无序变有序,可以用循环来处理。
参考链接:(略)。
100分通过的C语言程序之一:
#include <stdio.h> #include <string.h> 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<AN; k++) if(a[i + around[k].drow][j + around[k].dcol] == '*') count++; printf("%d", count); } } printf("\n"); } return 0; }
100分通过的C语言程序之二:
#include <stdio.h> 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<AN; k++) if(a[i + around[k].drow][j + around[k].dcol] != '*') a[i + around[k].drow][j + around[k].dcol]++; for(i=1; i<=n; i++) { for(j=1; j<=m; j++) if(a[i][j] == '*') printf("%c", a[i][j]); else printf("%d", a[i][j]); printf("\n"); } return 0; } /* 4 4 ?**? *?** ???? ??*? 2**3 *4** 1333 01*1 */