题目描述
扫雷游戏是一款十分经典的单机小游戏。在n行m列的雷区中有一些格子含有地雷(称之为地雷格),其他格子不含地雷(称之 为非地雷格)。玩家翻开一个非地雷格时,该格将会出现-个数字--提示周围格子中有多少个是地雷格。游戏的目标是在不翻出任何地雷格的条件下,找出所有的非地雷格。
现在给出n行m列的雷区中的地雷分布,要求计算出海个非地雷格周围的地雷格数。
注:一个格子的周围格子包括其上、下、左、右左上、右上、左下、右八个方向上与之直接相邻的格子。
输入格式
第一用一个空格隔开的两个整数n和m,分别表示雷区的行数和列数。
接下来n行,每行m个字符,描述了区中的地雷分布情况。字符*示相应格子是地雷格,字符?表
示相应格子是非地雷格。相邻字符之间无分隔符。
输出格式
输出文件包含n行,每行m个字符,描述整个雷区。用*示地雷格,碉围的地雷个数表示非地雷
格。相邻字符之间无分隔符。
输入输出样例
输入 | 输出 |
3 3 *?? ??? ?*? | *10 221 1*1 |
2 3 ?*? *?? | 2*1 *21 |
说明/提示
对于100%的数据,1<n<100,1<m<100。
题解
1.确定数组输入
因为有?*等字符,定义char数组。 接收直接遍历数组输入,要注意接收的数组范围 后面判断数组周围8个数时,边缘会产生数组越界,所以定义大小+2的数组。 后面要输入格式是nextLine(),前面是nextInt(),用一个nextInt来接\n。 具体解释可以看:Java基础之nextInt()与nextLine()区别(包括nextInt之后无法nextLine无法读取下一行的数据)
Scanner in=new Scanner(System.in);
int row=in.nextInt(); //定义输入的行
int col=in.nextInt(); //定义输入的列
in.nextLine(); //接上面输入剩下的\n
char[][] map=new char[row+2][col+2]; //数组越界问题
//开始输入
for(int i=1;i<map.length-1;i++) {
char[] arr=in.nextLine().toCharArray(); //每行输入先存入一个数组
for(int j=1;j<map[i].length-1;j++) {
map[i][j]=arr[j-1]; //存的数组传入整个地图
}
}
2.将输入的数组变为描述雷区数组
先遍历全部,因为题目说只有?和*直接用?作if条件。
for(int i=1;i<map.length-1;i++){
for(int j=1;j<map[i].length;j++) {
char num='0'; //字符要加''
if(map[i][j]=='?'){
for(int x=i-1;x<i+2;x++) { //判断周围8个地方
for(int y=j-1;y<j+2;y++) {
if(map[x][y]=='*') {
num++;
}
}
}
map[i][j]=num; //输出周围有多少地雷
}
}
判断周围地雷还可以写成下面这样,更简单。
if(a[i][j]=='?'){
if(map[i-1][j]=='*'){ //上
num++;
}
if(map[i+1][j]=='*'){ //下
num++;
}
if(map[i][j-1]=='*'){ //左
num++;
}
if(map[i][j+1]=='*'){ //右
num++;
}
if(map[i-1][j-1]=='*'){ //左上
num++;
}
if(map[i-1][j+1]=='*'){ //右上
num++;
}
if(map[i+1][j-1]=='*'){ //左下
num++;
}
if(map[i+1][j+1]=='*'){ //右下
num++;
}
}
3输出数组
for(int i=1;i<map.length-1;i++) { //遍历数组并输出
for(int j=1;j<map[i].length-1;j++) {
System.out.print(map[i][j]);
}
System.out.println();
}
参考代码
import java.util.Scanner;
public class Main{
public static void main(String[] args) {
Scanner in=new Scanner(System.in);
int row=in.nextInt(); //定义输入的行
int col=in.nextInt(); //定义输入的列
in.nextLine(); //接上面输入剩下的\n
char[][] map=new char[row+2][col+2]; //数组越界问题
for(int i=1;i<map.length-1;i++) {
char[] arr=in.nextLine().toCharArray(); //每行输入先存入一个数组
for(int j=1;j<map[i].length-1;j++) {
map[i][j]=arr[j-1]; //存的数组传入整个地图
}
}
for(int i=1;i<map.length-1;i++){
for(int j=1;j<map[i].length;j++) {
char num='0'; //字符要加''
if(map[i][j]=='?'){
for(int x=i-1;x<i+2;x++) { //判断周围8个地方
for(int y=j-1;y<j+2;y++) {
if(map[x][y]=='*') {
num++;
}
}
}
map[i][j]=num; //输出周围有多少地雷
}
}
}
for(int i=1;i<map.length-1;i++) { //遍历数组并输出
for(int j=1;j<map[i].length-1;j++) {
System.out.print(map[i][j]);
}
System.out.println();
}
}
}