NOIP--扫雷游戏
【问题描述】
扫雷游戏是一款十分经典的单机小游戏。在 n 行 m 列的雷区中有一些格子含有地雷(称之为地雷格),其他格子不含地雷(称之为非地雷格)。玩家翻开一个非地雷格时,该格将会出现一个数字——提示周围格子中有多少个是地雷格。游戏的目标是在不翻出任何地雷格的条件下,找出所有的非地雷格。
现在给出n行m列的雷区中的地雷分布,要求计算出每个非地雷格周围的地雷格数。
注:一个格子的周围格子包括其上、下、左、右、左上、右上、左下、右下八个方向上与之直接相邻的格子。
【输入格式】
输入文件名为 mine.in。
输入文件第一行是用一个空格隔开的两个整数n和m,分别表示雷区的行数和列数。
接下来 n 行,每行 m 个字符,描述了雷区中的地雷分布情况。字符’*’表示相应格子是地雷格,字符’?’表示相应格子是非地雷格。相邻字符之间无分隔符。
【输出格式】
输出文件名为 mine.out。
输出文件包含 n 行,每行 m 个字符,描述整个雷区。用’*’表示地雷格,用周围的地雷个数表示非地雷格。相邻字符之间无分隔符。
【输入样例 1】
3 3
*??
???
?*?
【输出样例1】
*10
221
1*1
【输入样例 2】
2 3
?*?
*??
【输出样例2】
2*1
*21
【数据说明】
对于 100%的数据,1≤n≤100,1≤m≤100。
问题分析:
考察:二维字符数组、暴力枚举
对二维字符数组的处理操作跟二维整型数组处理方式一样。
如何表示某个点的八个方向
方法1:
例如点(x,y)的上右下左,左上,左下,右下,右上八个方向的表示方法:
上:(x-1,y)
右:(x,y+1)
下:(x+1,y)
左:(x,y-1)
左上:(x-1,y+1)
左下:(x+1,y+1)
右下:(x+1,y-1)
右上:(x-1,y-1)
方法2:
int dx[8]= {-1,0,1,0,-1,1,1,-1}; //上右下左,左上,左下,右下,右上
int dy[8]= {0,1,0,-1,1,1,-1,-1};
例如点(x,y)的上右下左,左上,左下,右下,右上八个方向的表示方法:
上:(x+dx[0],y+dy[0])
右:(x+dx[1],y+dy[1])
下:(x+dx[2],y+dy[2])
左:(x+dx[3],y+dy[3])
左上:(x+dx[4],y+dy[4])
左下:(x+dx[5],y+dy[5])
右下:(x+dx[6],y+dy[6])
右上:(x+dx[7],y+dy[7])
如果同时要遍历八个方向,就可以使用循环来表示:
for(int i = 0;i < 8;i++){
int tx = x + dx[i];
int ty = y + dy[i];
}
处理过程:
1)输入二维字符数组表示地图
2)循环遍历二维字符数组中的每个字符
3)判断该字符如果是地雷就输出'*',如果不是地雷就判断八个方向上的字符是否为地雷,是则数量加1。
注意:二维数组的下标越界问题。
参考程序:
链接:https://pan.baidu.com/s/17m6r2ZTMAmtb7dbvPQ0z-A
提取码:4rpg
复制这段内容后打开百度网盘手机App,操作更方便哦--来自百度网盘超级会员V6的分享