Java-在2D数组中查找连续的元素

问题描述 投票:0回答:3

我在算法上遇到麻烦,假设以下情况:电影院有n行,每行包含m个座位(n和m不超过20)。一个二维矩阵存储有关已售出票证的信息,数字1表示该场所的票证已售出,数字0表示该场所可用。您想购买k张到同一行中相邻座位的门票。查找是否可以完成。

输入数据

在输入时,程序获取n行和m个席位的数量。然后,有n行,每行包含以空格分隔的m个数字(0或1)。最后一行包含数字k。

输出数据

程序应输出具有k个连续可用座位的行号。如果有几排具有k个可用座位,则输出具有这些座位的第一行。如果没有这样的行,则输出数字0。

代码

import java.util.Scanner;

class Main {
    static int findRowWithAvailableSeat(int[][] matrix, int tickets) {
        final int rows = matrix.length;
        final int columns = matrix[0].length;
        int seatCounter = 0;

        for (int r = 1; r <= rows; r++) {
            for (int c = 1; c <= columns; c++) {
                if (matrix[r][c] == 1) {
                    continue;
                } if (matrix[r][c] == matrix[r][c + 1]) {
                    seatCounter++;
                    if (seatCounter == tickets) {
                        return r;
                    }
                }
            }
        }
        return 0;
    }


    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        int rows = scanner.nextInt();
        int columns = scanner.nextInt();

        int[][] matrix = new int[rows][columns];
        for (int r = 0; r < rows; r++) {
            for (int c = 0; c < columns; c++) {
                matrix[r][c] = scanner.nextInt();
            }
        }
        int kTickets = scanner.nextInt();
        int rowWithAvailableSeats = findRowWithAvailableSeat(matrix, kTickets);
        System.out.println(rowWithAvailableSeats);
    }
}

我知道问题出在findRowWithAvailableSeat方法中。我想提示如何解决问题,而不是实际解决方案。非常感谢。

java search multidimensional-array
3个回答
0
投票

希望这会有所帮助

  1. 在main()方法上,将矩阵从索引0设置为1行,从索引0设置为1列。但是在findRowWithAvailableSeat()上,您从索引1开始。因此将永远不会访问索引0。
  2. } if (matrix[r][c] == matrix[r][c + 1]) {此行将尝试访问索引c + 1,将导致索引超出范围异常。您需要检查c + 1是否小于列大小,或者将matrix [r] [c]与0(matrix [r] [c] == 0)进行比较。
  3. 如果您正在寻找相邻的座位,那么当您访问售出的座位时(矩阵[r] [c] == 1),您需要重置seatCounter
  4. 您还需要为每一行重置seatCounter。

0
投票

我将每一行都放在一个字符串中,所有行都放在一个字符串数组a [m]中,然后在每一行上执行a [i] .contains(k):“ 1001101110100010110010”。包含(“ 000”)


0
投票

您的for循环从1而不是0开始

for (int r = 1; r <= rows; r++) {
    for (int c = 1; c <= columns; c++) {
        if (matrix[r][c] == 1) {

矩阵数组的第一个索引被跳过。因此,您不必检查第一行和每一行的第一座。

此外,没有为每行重置seatCounter。当前,它保留了前几行计算出的所有席位。

© www.soinside.com 2019 - 2024. All rights reserved.