解题思路:DFS+BFS
-
遍历输入的二维矩阵(假设二维矩阵的元素为data[i][j]),若data[i][j]==0,则进行BFS
-
BFS过程中,只要遇到边界,则设置返回值为false,否则返回true
-
若BFS返回为true,则立即进行DFS(这里用DFS是因为代码比较简介,也可以使用BFS进行)进行染色
```java
public class P1162填涂颜色 {
private static boolean[][] flages;
private static int[][] data;
public static void main(String[] args) {
// 数据输入
Scanner in = new Scanner(System.in);
int num = in.nextInt();
data = new int[num][num];
flages = new boolean[num][num];
for (int i = 0; i < num; i++) {
for (int j = 0; j < num; j++) {
data[i][j] = in.nextInt();
}
}
in.close();
// BFS找到要染色的位置
for (int i = 0; i < data.length; i++) {
for (int j = 0; j < data[0].length; j++) {
if (data[i][j] == 1 || flages[i][j] == true)
continue;
if (BFS(i, j)) {
DFS(i, j);// DFS染色
}
}
}
// 打印输出
for (int i = 0; i < data.length; i++) {
for (int j = 0; j < data[0].length; j++) {
if (j==num-1) {
System.out.print(data[i][j]);
}else {
System.out.print(data[i][j]+" ");
}
}
System.out.println();
}
}
//DFS==>染色
private static void DFS(int i, int j) {
if(data[i][j]!=0) return;
data[i][j]=2;
DFS(i+1, j);
DFS(i-1, j);
DFS(i, j+1);
DFS(i, j-1);
}
//BFS==>找闭圈,是闭圈则返回true,否则返回false
private static boolean BFS(int y, int x) {
boolean flage = true;
Queue<int[]> queue = new LinkedList<>();
queue.add(new int[]{y, x});// i为y轴,j为x轴
flages[y][x] = true;
while (!queue.isEmpty()) {
for (int i = 0; i < queue.size(); i++) {
int[] tmp = queue.poll();
int Y = tmp[0], X = tmp[1];
// 判断边界
if ((Y + 1 >= data.length || Y - 1 < 0)
|| (X + 1 >= data[0].length || X - 1 < 0)) {
flage = false;
}
if (Y + 1 < data.length && data[Y+1][X] == 0 && flages[Y+1][X] == false) {
flages[Y+1][X]=true;
queue.offer(new int[] {Y+1,X});
}
if (Y - 1 >= 0 && data[Y-1][X] == 0 && flages[Y-1][X] == false) {
flages[Y-1][X]=true;
queue.offer(new int[] {Y-1,X});
}
if (X + 1 < data[0].length && data[Y][X+1] == 0 && flages[Y][X+1] == false) {
flages[Y][X+1]=true;
queue.offer(new int[] {Y,X+1});
}
if (X - 1 >= 0 && data[Y][X-1] == 0 && flages[Y][X-1] == false) {
flages[Y][X-1]=true;
queue.offer(new int[] {Y,X-1});
}
}
}
return flage;
}
}