一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第1天,点击查看活动详情。
基站信号地图–对矩形范围内的基站进行重建
首先输入矩阵的m行n列数目进行初始化,接着输入操作次数和对应的操作命令
- add,对具体位置添加基站,如果已存在不做任何操作
- delete,对当前位置及范围内包括上、下、左、右及斜边相邻基站清除
该矩形范围初始化存在一些基站,每添加一个基站范围内包括上、下、左、右及斜边相邻的区域信号强度增加1,最终返回所有不包括基站位置信号强度之和
案例:
4 6
3
2 2
3 3
4 4
delete 4 3
delete 2 5
add 1 2
输出
11
分析:
初始化一个矩阵,将矩阵放基站的值置为1,则矩阵内除基站的方格的信号强度就是其九宫格内另外8个地方的值的和,然后遍历矩阵,除去基站求和即可。
代码如下:
public class Case01 {
static class Command {
private final String cmd;
private final int row;
private final int col;
Command(String inputStr) {
String[] inputArray = inputStr.split(" ");
this.cmd = inputArray[0];
this.row = Integer.parseInt(inputArray[1]);
this.col = Integer.parseInt(inputArray[2]);
}
}
// 待实现函数,在此函数中填入答题代码
private static int getMatrixSum(int rows, int cols, int[][] baseStations, Command[] commands) {
int[][] matrix = initMatrix(rows, cols, baseStations);
operMatrix(matrix, commands);
int count = 0;
for (int i = 1; i <= rows; i++) {
for (int j = 1; j <= cols; j++) {
if (matrix[i][j] == 0) {
int value = matrix[i - 1][j - 1] + matrix[i - 1][j + 1] + matrix[i - 1][j] +
matrix[i + 1][j - 1] + matrix[i + 1][j + 1] + matrix[i + 1][j]
+ matrix[i][j - 1] + matrix[i][j + 1];
count += value;
}
}
}
return Math.abs(count);
}
// 初始化一个多包一层的矩阵,方便计算
private static int[][] initMatrix(int rows, int cols, int[][] baseStations) {
int[][] matrix = new int[rows + 2][cols + 2];
int len = baseStations.length;
for (int i = 0; i < len; i++) {
int mRow = baseStations[i][0];
int mCol = baseStations[i][1];
// 有基站的地方设为-1或者1也可以
matrix[mRow][mCol] = -1;
}
return matrix;
}
// 按照命令操作那个多包一层的矩阵
private static void operMatrix(int[][] matrix, Command[] commands) {
for (Command command : commands) {
int mRow = command.row;
int mCol = command.col;
switch (command.cmd) {
case "add":
if (matrix[mRow][mCol] == 0) {
matrix[mRow][mCol] = -1;
}
break;
case "delete":
for (int i = 0; i < 3; i++) {
for (int j = 0; j < 3; j++) {
deleteOnMetrix(mRow + i - 1, mCol + j - 1, matrix);
}
}
break;
default:
break;
}
}
}
// 在矩阵上删除基站
private static void deleteOnMetrix(int row, int col, int[][] matrix) {
int rows = matrix.length;
int cols = matrix[0].length;
if (row != 0 && row != rows - 1 && col != 0 && col != cols - 1) {
if (matrix[row][col] == -1) {
matrix[row][col] = 0;
}
}
}
public static void main(String[] args) {
Scanner cin = new Scanner(System.in, StandardCharsets.UTF_8.name());
int rows = cin.nextInt();
int cols = cin.nextInt();
cin.nextLine();
int baseStationCnt = Integer.parseInt(cin.nextLine());
int[][] baseStations = new int[baseStationCnt][2];
for (int i = 0; i < baseStationCnt; i++) {
String[] line = cin.nextLine().split(" ");
baseStations[i][0] = Integer.parseInt(line[0]);
baseStations[i][1] = Integer.parseInt(line[1]);
}
int cmdCnt = Integer.parseInt(cin.nextLine());
Command[] commands = new Command[cmdCnt];
for (int i = 0; i < cmdCnt; i++) {
commands[i] = new Command(cin.nextLine());
}
cin.close();
int result = getMatrixSum(rows, cols, baseStations, commands);
System.out.println(result);
}
}