我在算法上遇到麻烦,假设以下几点: 电影院有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方法中。我想提示如何解决问题,而不是实际解决方案。非常感谢。
编辑
我终于可以解决它了(或者至少它能按预期工作,我不确定这是否是最好的实现)。谢谢大家的提示。
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;
}
答案 0 :(得分:0)
希望这会有所帮助
} if (matrix[r][c] == matrix[r][c + 1]) {
此行将尝试访问索引c + 1,将导致索引超出范围。您需要检查c + 1是否小于列大小,或者将matrix [r] [c]与0(matrix [r] [c] == 0)进行比较。答案 1 :(得分: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])
答案 2 :(得分:0)
我将每一行放入一个字符串中,并将所有行放入一个字符串数组a [m]中,然后在每一行上执行a [i] .contains(k): “ 1001101110100010110010”。包含(“ 000”)
答案 3 :(得分:0)
这是您需要的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开始。