【题目描述】
由数字0组成的方阵中,有一任意形状闭合圈,闭合圈由数字1构成,围圈时只走上下左右4个方向。现要求把闭合圈内的全部空间都填写成2.例如:6 6×6的方阵(n=6),涂色前和涂色后的方阵以下:java
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
输入格式
每组测试数据第一行一个整数n(1≤n≤30)code
接下来n行,由0和1组成的n×n的方阵。class
方阵内只有一个闭合圈,圈内至少有一个0。import
输出格式
已经填好数字2的完整方阵。List
输入输出样例
输入
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
说明/提示
1≤n≤30map
先上代码:im
import java.util.LinkedList; import java.util.Queue; import java.util.Scanner; public class Main { static int[][]vis = new int[40][40]; static int [][]map = new int[40][40]; static Queue<Integer> qx = new LinkedList<Integer>(); static Queue<Integer> qy = new LinkedList<Integer>(); static int []dx = {1,0,-1,0}; static int []dy = {0,1,0,-1}; static int n; public static boolean inmap(int x,int y) { return(x>=0&&x<=n+1&&y>=0&&y<=n+1); } public static void bfs(int x,int y) { while(!qx.isEmpty())//不为空的状态下 { for (int i = 0; i < 4; i++) { int xx = qx.peek()+dx[i]; int yy = qy.peek()+dy[i]; if(inmap(xx,yy)&&vis[xx][yy]!=1&&map[xx][yy]!=1) { qx.offer(xx); qy.offer(yy); vis[xx][yy] = 1; } } qx.poll(); qy.poll(); } } public static void main(String[] args) { Scanner s = new Scanner(System.in); n = s.nextInt(); for (int i = 1; i <= n; i++) { for (int j = 1; j <= n; j++) { map[i][j] = s.nextInt(); } } qx.offer(0); qy.offer(0); vis[0][0] = 1;//标记这个点已经走过 bfs(0,0); for (int i = 1; i <= n; i++) { for (int j = 1; j <= n; j++) { if(vis[i][j]==0&&map[i][j]==0) { System.out.print(2+" "); } else { System.out.print(map[i][j]+" "); } } System.out.println(); } } }