算法题-基站信号地图

881 阅读2分钟

一起养成写作习惯!这是我参与「掘金日新计划 · 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);
	    }
	}