由题意得知本题是通过bfs的方法计算最终的字符串,我们可以将接收到的字符转为数字,将所有的字符减去g,循环指定的m天→若是等于0则说明这是草地向上下左右进行扩散为0,若不是草地则不进行操作.最后进行格式化输出(将所有数字输出为0输出g为其它数字输出.)。
①使用数组存储给定元素
②每循环一次终止
③循环m次达到月数限制即可
④根据题目条件设置循环内部结构
⑤按照题目规则输出答案
static int[][] grow= {{-1,0},{0,1},{1,0},{0,-1}};
static int[][] arr=new int[10000][10000];
static char[][] c;
public static void bfs() {
int n=c.length;
int m=c[0].length;
int [][]arr2= new int[n][m];
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++) {
arr2[i][j]=arr[i][j];
//System.out.print(arr[i][j]+" ");测试点
}
}
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++) {
if (arr2[i][j]==0) {
for (int k = 0; k < grow.length; k++) {
if (i+grow[k][0]>=0 && j+grow[k][1]>=0 &&
i+grow[k][0]<n && j+grow[k][1]<m) {
arr[i+grow[k][0]][j+grow[k][1]]=0;
}
}
}
}
}
return;
}
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
int x=scan.nextInt();
int y=scan.nextInt();
c=new char[x][y];
scan.nextLine();
for (int i = 0; i < x; i++) {
String string=scan.nextLine();
char[] charArray = string.toCharArray();
for (int j = 0; j < y; j++) {
c[i][j]=charArray[j];
arr[i][j]=c[i][j]-'g';
}
}
int m=scan.nextInt();
while (m-->0) {
bfs();
}
for (int i = 0; i < x; i++) {
for (int j = 0; j < y; j++) {
prints(arr[i][j]);
}
System.out.println();
}
scan.close();
}
public static void prints(int x) {// 打印
if (x==0) {
System.out.print("g");
}else {
System.out.print(".");
}
}
改善了一下,咋们可以仔细研究下上面的代码。下面的有注释👇
static int[][] grow= {{-1,0},{0,1},{1,0},{0,-1}};//四个方向
static int[][] arr=new int[1000][1000];//结果数组
static int x,y;
public static void bfs() {
int [][]arr2= new int[x][y];//复制原数组
for (int i = 0; i < x; i++) {
for (int j = 0; j < y; j++) {
arr2[i][j]=arr[i][j];//开始复制
//System.out.print(arr[i][j]+" ");测试点
}
}
for (int i = 0; i < x; i++) {
for (int j = 0; j < y; j++) {
if (arr2[i][j]==0) {//判断是不是青草
for (int k = 0; k < grow.length; k++) {//是青草就得让它四周长起来
if (i+grow[k][0]>=0 && j+grow[k][1]>=0 &&
i+grow[k][0]<x && j+grow[k][1]<y) {
arr[i+grow[k][0]][j+grow[k][1]]=0;//四周长起来
}
}
}
}
}
return;
}
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
x=scan.nextInt();//接收数据
y=scan.nextInt();
char[][] c = new char[x][y];
scan.nextLine();
for (int i = 0; i < x; i++) {//处理数据
String string=scan.nextLine();
char[] charArray = string.toCharArray();
for (int j = 0; j < y; j++) {
c[i][j]=charArray[j];
arr[i][j]=c[i][j]-'g';
}
}
int z=scan.nextInt();
while (z-->0) {//几个月就循环几次
bfs();//调用长草
}
for (int i = 0; i < x; i++) {
for (int j = 0; j < y; j++) {//按格式输出
prints(arr[i][j]);
}
System.out.println();
}
scan.close();
}
public static void prints(int x) {// 打印
if (x==0) {
System.out.print("g");
}else {
System.out.print(".");
}
}
输入 ←请记得删除
4 5
.g...
.....
..g..
.....
2
//输出
gggg.
gggg.
ggggg
.ggg.