牛客:扫雷
题目描述
小sun上课的时候非常喜欢玩扫雷。他现小sun有一个初始的雷矩阵,他希望你帮他生成一个扫雷矩阵。 扫雷矩阵的每一行每一列都是一个数字,每个数字的含义是与当前位置相邻的8个方向中,有多少个雷(在下图中,雷用表示);如果当前位置就是雷的话,仍输出一个。
比如初始的雷矩阵如下:
.... ..** *.*. .*.*
对应的数字矩阵为:
0122 13** *4*4 2*3*
输入描述:
第一行两个整数n,m,代表矩阵有n行m列 接下来共n行,每行m个字符
输出描述:
输出共n行m列,为扫雷矩阵。
示例1
输入
复制
4 4 .... ..** *.*. .*.*
输出
复制
0122 13** *4*4 2*3*
示例2
输入
复制
3 4 .... *..* .*.*
输出
复制
1111 *23* 2*3*
代码
public class Main {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
int m = in.nextInt();
int n = in.nextInt();
int[][] a = new int[m+2][n+2];//这个一定要多两个,不然会数组越界,因为要计算8个方向的雷的个数
for(int i=1;i<=m;i++)//这个要从1开始,从零会发生数组越界比如a[i-1][j-1]
{
String b = in.next();
for(int j=1;j<=n;j++)
{
a[i][j] = b.charAt(j-1)=='*'?1:0;//对数组进行赋初值,如果是雷则赋值为1,否则为1,为下面求八个方向的雷的个数做铺垫
}
}
StringBuilder c = new StringBuilder();
for(int i=1;i<=m;i++)
{
for(int j=1;j<=n;j++)
{
if(a[i][j]==1)
c.append("*");
else
c.append(a[i-1][j]+a[i-1][j-1]+a[i][j-1]+a[i+1][j-1]+a[i+1][j]+a[i+1][j+1]+a[i][j+1]+a[i-1][j+1]);//如果是雷则提前设其值为1,则8个方位相加,会增大1,不是雷,则值不变
}
c.append("\n");
}
System.out.println(c);
}
}
知识点:
StringBuilder类可变字符串,StringBuilder对象的内容可以修改
StringBuilder类常用的方法
-
append()方法:实现字符串的拼接操作
-
reverse()方法:实现StringBuilder字符串的反转操作
-
delete(int start,int end)方法:删除字符串中指定索引范围为[start,end)的所有内容
-
insert(int start,任意数据类型)方法:在索引处插入任意数据类型的内容,插入内容的起始索引是start
String转为StringBuilder
StringBuilder sb = new StringBuilder(str);
StringBuilder转为String:通过调用StringBuilder对象调用toString()方法
String str = sb.toString();