代码优点:思路清晰易懂,答案正确。代码缺点:代码冗余过多,可优化 。
本题可用深度优先搜索很简单就可以解决,但我没学,下次学了把简洁的代码补上。
如果你有好的优化方法可在下方评论,大家一起学习进步,谢谢!
参考代码:
import java.util.Arrays;
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();
int count=1;
while(n!=0&&m!=0) {
if(count!=1) {
System.out.println();
}
char[][] a=new char[n][m];
for(int i=0;i<n;i++)//初始化
Arrays.fill(a[i], '0');
char[][] arr=new char[n][m];
for(int i=-1;i<n;i++) {//输入
String s=in.nextLine();
if(i==-1)continue;
for(int j=0;j<m;j++) {
arr[i][j]=s.charAt(j);
}
}
if(arr[0][0]=='*') {//处理四个角
a[0][0]='*';
if(a[0][1]!='*')
a[0][1]=(char) (a[0][1]+1);
if(a[1][0]!='*')
a[1][0]=(char) (a[1][0]+1);
if(a[1][1]!='*')
a[1][1]=(char) (a[1][1]+1);
}
if(arr[0][m-1]=='*') {
a[0][m-1]='*';
if(a[0][m-2]!='*')
a[0][m-2]=(char) (a[0][m-2]+1);
if(a[1][m-1]!='*')
a[1][m-1]=(char) (a[1][m-1]+1);
if(a[1][m-2]!='*')
a[1][m-2]=(char) (a[1][m-2]+1);
}
if(arr[n-1][0]=='*') {
a[n-1][0]='*';
if(a[n-1][1]!='*')
a[n-1][1]=(char) (a[n-1][1]+1);
if(a[n-2][0]!='*')
a[n-2][0]=(char) (a[n-2][0]+1);
if(a[n-2][1]!='*')
a[n-2][1]=(char) (a[n-2][1]+1);
}
if(arr[n-1][m-1]=='*') {
a[n-1][m-1]='*';
if(a[n-1][m-2]!='*')
a[n-1][m-2]=(char) (a[n-1][m-2]+1);
if(a[n-2][m-1]!='*')
a[n-2][m-1]=(char) (a[n-2][m-1]+1);
if(a[n-2][m-2]!='*')
a[n-2][m-2]=(char) (a[n-2][m-2]+1);
}
for(int i=1;i<n-1;i++) {//处理四周(列)
if(arr[i][0]=='*') {
a[i][0]='*';
if(a[i-1][0]!='*')
a[i-1][0]=(char) (a[i-1][0]+1);
if(a[i-1][1]!='*')
a[i-1][1]=(char) (a[i-1][1]+1);
if(a[i][1]!='*')
a[i][1]=(char) (a[i][1]+1);
if(a[i+1][0]!='*')
a[i+1][0]=(char) (a[i+1][0]+1);
if(a[i+1][1]!='*')
a[i+1][1]=(char) (a[i+1][1]+1);
}
if(arr[i][m-1]=='*') {
a[i][m-1]='*';
if(a[i-1][m-2]!='*')
a[i-1][m-2]=(char) (a[i-1][m-2]+1);
if(a[i-1][m-1]!='*')
a[i-1][m-1]=(char) (a[i-1][m-1]+1);
if(a[i][m-2]!='*')
a[i][m-2]=(char) (a[i][m-2]+1);
if(a[i+1][m-2]!='*')
a[i+1][m-2]=(char) (a[i+1][m-2]+1);
if(a[i+1][m-1]!='*')
a[i+1][m-1]=(char) (a[i+1][m-1]+1);
}
}
for(int i=1;i<m-1;i++) {//处理四周(行)
if(arr[0][i]=='*') {
a[0][i]='*';
if(a[0][i-1]!='*')
a[0][i-1]=(char) (a[0][i-1]+1);
if(a[0][i+1]!='*')
a[0][i+1]=(char) (a[0][i+1]+1);
if(a[1][i-1]!='*')
a[1][i-1]=(char) (a[1][i-1]+1);
if(a[1][i]!='*')
a[1][i]=(char) (a[1][i]+1);
if(a[1][i+1]!='*')
a[1][i+1]=(char) (a[1][i+1]+1);
}
if(arr[n-1][i]=='*') {
a[n-1][i]='*';
if(a[n-1][i-1]!='*')
a[n-1][i-1]=(char) (a[n-1][i-1]+1);
if(a[n-1][i+1]!='*')
a[n-1][i+1]=(char) (a[n-1][i+1]+1);
if(a[n-2][i-1]!='*')
a[n-2][i-1]=(char) (a[n-2][i-1]+1);
if(a[n-2][i]!='*')
a[n-2][i]=(char) (a[n-2][i]+1);
if(a[n-2][i+1]!='*')
a[n-2][i+1]=(char) (a[n-2][i+1]+1);
}
}
for(int i=1;i<n-1;i++) {//处理中心位置
for(int j=1;j<m-1;j++) {
if(arr[i][j]=='*') {
a[i][j]='*';
if(a[i-1][j-1]!='*')
a[i-1][j-1]=(char) (a[i-1][j-1]+1);
if(a[i-1][j]!='*')
a[i-1][j]=(char) (a[i-1][j]+1);
if(a[i-1][j+1]!='*')
a[i-1][j+1]=(char) (a[i-1][j+1]+1);
if(a[i][j-1]!='*')
a[i][j-1]=(char) (a[i][j-1]+1);
if(a[i][j+1]!='*')
a[i][j+1]=(char) (a[i][j+1]+1);
if(a[i+1][j-1]!='*')
a[i+1][j-1]=(char) (a[i+1][j-1]+1);
if(a[i+1][j]!='*')
a[i+1][j]=(char) (a[i+1][j]+1);
if(a[i+1][j+1]!='*')
a[i+1][j+1]=(char) (a[i+1][j+1]+1);
}
}
}
System.out.printf("Field #%d:\n",count);//输出
count++;
for(int i=0;i<n;i++) {
for(int j=0;j<m;j++) {
System.out.print(a[i][j]);
}
System.out.println();
}
n=in.nextInt();
m=in.nextInt();
}
}
}