Introduction
由数字00组成的方阵中,有一任意形状闭合圈,闭合圈由数字11构成,围圈时只走上下左右44个方向。现要求把闭合圈内的所有空间都填写成22.例如:6 \times 66×6的方阵(n=6n=6),涂色前和涂色后的方阵如下:
0 0 0 0 0 0
0 0 1 1 1 1
0 1 1 0 0 1
1 1 0 0 0 1
1 0 0 0 0 1
1 1 1 1 1 1
0 0 0 0 0 0
0 0 1 1 1 1
0 1 1 2 2 1
1 1 2 2 2 1
1 2 2 2 2 1
1 1 1 1 1 1
Input
每组测试数据第一行一个整数n(1 \le n \le 30)n(1≤n≤30)
接下来nn行,由00和11组成的n \times nn×n的方阵。
方阵内只有一个闭合圈,圈内至少有一个00。
Output
已经填好数字22的完整方阵。
Sample
input
6
0 0 0 0 0 0
0 0 1 1 1 1
0 1 1 0 0 1
1 1 0 0 0 1
1 0 0 0 0 1
1 1 1 1 1 1
output
0 0 0 0 0 0
0 0 1 1 1 1
0 1 1 2 2 1
1 1 2 2 2 1
1 2 2 2 2 1
1 1 1 1 1 1
Solution
import java.util.Scanner;
public class Main4 {
static int[][] arr;
static boolean[][] flag;
static boolean isOk=true;
static int n;
static int[] X={1,0,-1,0};static int[] Y={0,1,0,-1};
public static void main(String[] args) {
Scanner s=new Scanner(System.in);
n=s.nextInt();
arr=new int[n][n];
flag=new boolean[n][n];
for(int i=0;i<n;i++){
for (int j=0;j<n;j++){
arr[i][j]=s.nextInt();
if(arr[i][j]==1)flag[i][j]=true;
}
}
for(int i=0;i<n;i++){
for (int j=0;j<n;j++){
if(!flag[i][j]){
isOk=true;
dfs(i,j);
}
}
}
for(int i=0;i<n;i++){
for (int j=0;j<n;j++){
System.out.print(arr[i][j]+" ");
}
System.out.println();
}
}
static void dfs(int i,int j){
if(i<0||j<0||i>=n||j>=n){
isOk=false;
return;
}
if(!isOk||flag[i][j])return;
arr[i][j]=2;
flag[i][j]=true;
for(int k=0;k<4;k++){
dfs(i+X[k],j+Y[k]);
}
if(!isOk){
arr[i][j]=0;
flag[i][j]=false;
}
}
}
Experience
dfs第一次很流畅的就过了,其实能用dfs的地方,可以先考虑bfs,更容易理解和实现