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; } } }