牛客:扫雷

题目描述

小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();