题目描述:
由数字 00 组成的方阵中,有一任意形状的由数字 11 构成的闭合圈。现要求把闭合圈内的所有空间都填写成 22。例如:6×66×6 的方阵(𝑛=6n=6),涂色前和涂色后的方阵如下:
如果从某个 00 出发,只向上下左右 44 个方向移动且仅经过其他 00 的情况下,无法到达方阵的边界,就认为这个 00 在闭合圈内。闭合圈不一定是环形的,可以是任意形状,但保证闭合圈内的 00 是连通的(两两之间可以相互到达)。
0 0 0 0 0 0
0 0 0 1 1 1
0 1 1 0 0 1
1 1 0 0 0 1
1 0 0 1 0 1
1 1 1 1 1 1
0 0 0 0 0 0
0 0 0 1 1 1
0 1 1 2 2 1
1 1 2 2 2 1
1 2 2 1 2 1
1 1 1 1 1 1
代码:
package lanqiao;
import java.util.*;
public class Main {
static int[] dx = {-1,0,1,0};
static int[] dy = {0,-1,0,1};
static int n;
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
n = sc.nextInt();
int map[][] = new int[n + 1][n +1];
for(int i = 1;i <= n;i ++)
{
for(int j = 1;j <= n;j ++)
{
map[i][j] = sc.nextInt();
}
}
for (int i=1;i <= n;i++){
for (int j=1;j <= n;j++){
if (map[i][j]==1){
bfs(map,i+1,j+1);
//终止符.找到开始坐标跳出两个循环
i=40;
j=40;
}
}
}
for (int i=1;i <= n;i++){
for (int j=1;j <= n;j++){
System.out.print(map[i][j]+" ");
}
System.out.println();
}
}
public static void bfs(int[][] map,int x,int y){
map[x][y] = 2;
for(int k = 0;k <4;k ++)
{
int xx = x + dx[k];
int yy = y + dy[k];
//标记
if(xx < 1 || yy < 1 || xx > n || yy > n || map[xx][yy] == 1 || map[xx][yy] == 2){
continue;
}
bfs(map,xx,yy);
}
}
}