洛谷链接:https://www.luogu.com.cn/problem/P1162
import java.util.Scanner;
public class Main {
static int n=0,s=0;
static int[][] a=new int[100][100];
static int[][] used=new int[100][100];
static int[] kx={0,1,-1,0,0};
static int[] ky={0,0,0,1,-1};
//如果新的数在整个数组范围内并且不是障碍(能走),那么就搜索从这个格子能走到其他哪些格子
public static void dfs(int x,int y) {
used[x][y]=1;
for(int i=1;i<=4;i++){ //向四个方向搜索
int x0=x+kx[i];
int y0=y+ky[i];
if(x0>0 && x0<=n && y0>0 && y0<=n && used[x0][y0]==0) {
dfs(x0,y0);
}
}
}
public static void main(String[] args) {
Scanner in=new Scanner(System.in);
//输入
n=in.nextInt();
//初始化数组,将墙标记为1
for(int i=1;i<=n;i++) {
for(int j=1;j<=n;j++) {
a[i][j]=in.nextInt();
used[i][j]=a[i][j];
}
}
//从四面涌进来
//搜索第一列和最后一列的格子
for(int i=1;i<=n;i++){
if(a[i][1]==0) dfs(i,1); //如果有能过的就搜索
if(a[i][n]==0) dfs(i,n);
}
//搜索第一行和最后一行的格子
for(int i=1;i<=n;i++){
if(a[1][i]==0) dfs(1,i);
if(a[n][i]==0) dfs(n,i);
}
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
if(used[i][j]==0) {
System.out.print("2 ");
}else {
System.out.print(a[i][j]+" ");
}
}
System.out.println();
}
}
}