题目描述:
你玩过扫雷船吗?这个可爱的小游戏有一个我们不记得名字的操作系统。
游戏的目标是找出所有的地雷在一个MxN场内的位置。
游戏显示一个正方形中的一个数字,它告诉你在那个方块附近有多少个地雷。
每个广场最多有八个相邻的方块。
左边的4x4字段包含两个地雷,每个地雷都以“*”字符表示。
如果我们用上面描述的暗示数来表示同一个字段,
我们就会得到右边的字段:*.*..。...*100 2210 1*10 1110
输入:
输入将由任意数目的字段组成。
每个字段的第一行包含两个整数n和m(0<n,m$100),它们分别代表字段的行数和列数。
下面n行中的每一行都精确地包含m个字符,表示字段。
安全方格用'.'表示。地雷方格是'*',两者都没有引号。
第一个字段行,其中n=m=0表示输入的结尾,不应该进行处理。
输出:
对于每个字段,只在一行上打印消息字段#x:,其中x代表从1开始的字段数。
下n行应该包含带有'.'的字段。
字符替换为与该方格相邻的地雷数。字段输出之间必须有空行。
样例输入:
4 4
*...
....
.*..
....
3 5
**...
.....
.*...
0 0
样例输出:
Field #1:
*100
2210
1*10
1110
Field #2:
**100
33200
1*100
参考解答:
import java.util.Arrays;
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int line_num, column_num;
line_num = sc.nextInt();
column_num = sc.nextInt();
String temp = sc.nextLine();
int sum = 1;
while (line_num != 0 && column_num != 0) {
String[] str = new String[line_num];
for (int i = 0; i < line_num; i++) {
str[i] = sc.nextLine();
}
System.out.println("Field #" + (sum++) + ":");
char[][] char_array = new char[line_num][column_num];
for (int i = 0; i < line_num; i++) {
char_array[i] = str[i].toCharArray();
}
count(char_array, line_num, column_num);
System.out.println();
line_num = sc.nextInt();
column_num = sc.nextInt();
temp = sc.nextLine();
}
}
private static void count(char[][] str, int line_num, int column_num) {
int[][] count = new int[line_num][column_num];
for (int i = 0; i < line_num; i++) {
Arrays.fill(count[i], -1);
}
for (int i = 0; i < line_num; i++) {
for (int j = 0; j < column_num; j++) {
if (str[i][j] == '.') {
count[i][j] = sum(str, i, j, line_num, column_num);
}
}
}
for (int i = 0; i < line_num; i++) {
for (int j = 0; j < column_num; j++) {
if (str[i][j] == '*') {
System.out.print("*");
}
else {
System.out.print(count[i][j]);
}
}
System.out.println();
}
}
private static int sum(char[][] str, int x, int y, int line_num, int column_num) {
int sum = 0;
for (int i = -1; i <= 1; i++) {
for (int j = -1; j <= 1; j++) {
if (notOutOfArrayBounds(x + i, y + j, line_num, column_num) && str[x + i][y + j] == '*') {
sum++;
}
}
}
return sum;
}
private static boolean notOutOfArrayBounds(int i , int j, int line_num, int column_num) {
return (i >= 0 && i < line_num && j >= 0 && j < column_num);
}
}