[英]Java - find consecutive elements in 2D array
我在使用算法时遇到问题,假设如下:电影院有 n 排,每排有 m 个座位(n 和 m 不超过 20)。 一个二维矩阵存储了售票信息,数字1表示该地点的票已售出,数字0表示该地点可用。 你想买k张到同一排相邻座位的票。 看看能不能做。
输入数据
在输入上,程序获得 n 行和 m 个座位的数量。 然后,有 n 行,每行包含 m 个数字(0 或 1),以空格分隔。 最后一行包含一个数字 k。
Output数据
程序应该 output 连续有 k 个可用座位的行数。 如果有几排有 k 个可用座位,则 output 第一排有这些座位。 如果没有这样的行,output 为数字 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 方法的某个地方。 我想要一个关于如何解决问题的提示,而不是实际的解决方案。 非常感谢。
编辑
我终于可以解决它(或者至少它按预期工作,我不确定它是否是最好的实现)。 谢谢大家的提示。
static int findRowWithAvailableSeat(int[][] matrix, int tickets) {
final int rows = matrix.length;
final int columns = matrix[0].length;
int seatCounter;
for (int r = 0; r < rows; r++) {
seatCounter = 0;
for (int c = 0; c < columns; c++) {
if (matrix[r][c] == 1) {
seatCounter = 0;
continue;
}
if (matrix[r][c] == 0) {
seatCounter++;
if (seatCounter == tickets) {
return r + 1;
}
}
}
}
return 0;
}
希望这可以帮助
} if (matrix[r][c] == matrix[r][c + 1]) {
此行将尝试访问索引 c+1,将导致索引超出范围异常。 您需要检查 c+1 是否小于列大小或将 matrix[r][c] 与 0 进行比较(matrix[r][c] == 0)。您的 for 循环从 1 而不是 0 开始
for (int r = 1; r <= rows; r++) {
for (int c = 1; c <= columns; c++) {
if (matrix[r][c] == 1) {
正在跳过矩阵数组的第一个索引。 因此,您不会检查第一排和每排的第一个座位。
此外, seatCounter
不会为每一行重置。 它目前保留从前几排计算的所有座位。
我也不确定这是为了什么
if (matrix[r][c] == matrix[r][c + 1])
我会将每一行放在一个字符串中,并将所有行放在一个字符串数组 a[m] 中,然后在每一行上执行 a[i].contains(k):“1001101110100010110010”.contains(“000”)
以下是您需要的 4 个提示:
不要比较matrix[r][c] == matrix[r][c + 1]
。 简单地与 0 进行比较: matrix[r][c] == 0
。 避免 ArrayIndexOutOfBoundsException
正如 DarkSigma 已经指出的那样,从 0 而不是 1 开始循环迭代器: for (int r = 0; r < rows...
将每行的seatCounter
重新初始化为 0。
和! 当您打印出System.out.println(rowWithAvailableSeats)
时,请记住行数从 0 开始。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.