d28
题目
思路
关键点:定义一个比arr0(记录雷区情况的数组)多两行两列的数组 arr,将arr0放入arr
arr上下左右各比arr0多一行,这样能避免越界问题(但是我不理解原本写法为什么越界)
思路:
将雷区情况存入数组arr0,定义一个比arr0多两行两列的数组 arr,将arr0放入大数组arr
遍历大数组:
如果是'*'则输出*
如果不是,定义一个计数器,遍历附近九宫格,如果有*,就c++,最后输出c
int c = 0;
for (int k = i - 1; k <= i + 1; k++) {
for (int l = j - 1; l <= j + 1; l++) {
if (arr[k][l] == '*')
c++;
}
}
System.out.print(c);
思路有参考:【模拟与高精度】【JAVA】P2670 [NOIP2015 普及组] 扫雷游戏_p2670 [noip2015 普及组] 扫雷游戏c stdio-CSDN博客
代码
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
int n = in.nextInt();
int m = in.nextInt();
char[][] arr0 = new char[n][m];//本身
char[][] arr = new char[n + 2][m + 2];//拓展后的数组
//分行读取字符
for (int i = 0; i < n; i++) {
String a = in.next();//第n行
char[] temp = a.toCharArray();
for (int j = 0; j < m; j++) {
arr0[i][j] = temp[j];
}
}
//将arr的元素都定义为!;
for (int i = 0; i < arr.length; i++) {
for (int j = 0; j < arr[i].length; j++) {
arr[i][j] = '!';
}
}
//将arr0放入arr中
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++) {
arr[i + 1][j + 1] = arr0[i][j];
}
}
for (int i = 1; i < n + 2 - 1; i++) {
for (int j = 1; j < m + 2 - 1; j++) {
if (arr[i][j] == '*') {
System.out.print('*');
} else {
int c = 0;
for (int k = i - 1; k <= i + 1; k++) {
for (int l = j - 1; l <= j + 1; l++) {
if (arr[k][l] == '*')
c++;
}
}
System.out.print(c);
}
}
System.out.println();
}
}
}
记录
29号的题目,30号终于写出来
问题1:Scanner 的各种next用法不是很明了
不明白为什么用next 不能用nextLine()
问题2:数组总是越界,不知道为什么
问题3:当一个算法一直想不通,就换一个算法,目的是用一个更好的方法把题目写出来,有问题卡壳,就换一种写法。写出来以后再去研究哪里出问题
笔记:
基本数据类型用==
引用类型用equals()方法,比如说 String