某地区爆发病毒,给定一个矩阵,x
代表隔离墙,o
代表病毒,病毒区域是由它水平方向或垂直方向上相邻的病毒连接而成,斜角连接不会构成病毒区域。你要计算出矩阵中有几个病毒区域(假设矩阵周边是被隔离墙包围的)。
请在右侧编辑器中填充代码,补全virusArea(int n,int m,char[][] area)
函数,对输入的矩阵进行计算,返回“病毒区域”的个数,函数参数说明如下:
n
:矩阵的行m
:矩阵的列area
:待计算的矩阵
逻辑:类似BFS算法清除矩阵上大于1的点
- 全局搜索'o'
- 把'o'编程'x',然后以他为中心采用队列的方式进行上下左右搜索
- 若遇到'o',则变为'x',同时加入队列,只到没有'o',则记为一块病毒区域
- 若没有遇到'o',则进行第一步,知道全局没有'o'
package com.cqu.bob;
import java.awt.Point;
import java.util.LinkedList;
import java.util.Queue;
public class numberVirusArea {
public int virusArea(int n, int m, char[][] area) {
/********* Begin *********/
int sum = 0;
Boolean ite = true;
outer: while (ite) {
int dx = 0, dy = 0, gx = 0, gy = 0;
outer1: for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++) {
if (area[i][j] == 'o') {
gx = i;
gy = j;
break outer1;
}
if (i == n - 1 && j == m - 1) {
ite = false;
break outer;
}
}
}
area[gx][gy] = 'x';
Queue<Point> q = new LinkedList<Point>();
int[] tx = { -1, 1, 0, 0 };
int[] ty = { 0, 0, 1, -1 };
q.offer(new Point(gx, gy));
while (q.size() > 0) {
Point p = q.poll();
for (int i = 0; i < 4; i++) {
int x = p.x + tx[i];
int y = p.y + ty[i]; // p为当前位置;
if (x >= 0 && x < n && y >= 0 && y < m && area[x][y] == 'o') {
area[x][y] = 'x';
q.offer(new Point(x, y));
}
}
}
sum++;
}
return sum;
/********* End *********/
}
}