不明白如何解决这个问题。 我需要接受座位号作为参数(座位)。然后将该座位号转换为二维数组的行和列索引。
检查自己我一直假设有10行(0-9)和2个座位佩尔(0-1)并从1-20中选出一个座位来检查数学。但是可以有任意数量的行和列。这就是我用来检查自己的方式。
static void isAvailable(int seat, boolean seat[][]) {
int row = 0;
int column = 0;
if (seat > 0 && seat <= (getRows() * getSeatsPerRow())){
row = (seat ) % getRows();
column = (seat - 1) % getSeatsPerRow;
seat[row][column] = false;
}
}
假设座位是这样排列的:
seatsPerRow
0 1 2 3 4 5 6
0 (1) (2) (3) (4) (5) (6) (7)
r 1 (8) (9) (10)(11)(12)(13)(14)
o 2 (15)(16)(17)(18)(19)(20)(21)
w 3 ...
s 4 ...
.
.
.
说我想找到座位11.这将是座位[1] [3]。我不明白如何将座位号转换为二维阵列上的位置。
答案 0 :(得分:1)
假设座位安排是这样的:
1 2
3 4
5 6
7 8
9 10
11 12
13 14
15 16
17 18
19 20
int col = (seat % 2 == 0)? 1:0;
int row = (int)Math.ceil(seat / 2.0f);
答案 1 :(得分:1)
好吧,假设座位从1开始编号,您只需使用:
即可获得列索引int column = (seatNum - 1) % seat[0].length;
然后,您可以使用简单表达式找到该行:
int row = (int) ((seatNum - 1) / seat[0].length);
然后,您可以通过以下方式获得实际元素:
seats[row][column]
这两个表达式都适用于seat
数组的所有维度(0 x 0除外)。
第一行将使用modulo来查找seatNum / seat[0].length
的余数,或者基本上座位数除以每行的座位数。这会将column
重新调整到正确的范围。
接下来,第二行将座位数除以行的长度,这将找到行本身。然后我们将它转换为带有(int)
的int,它会截断它,删除可能由该操作产生的任何小数。在这种情况下,我们实际上是在执行纯整数数学运算,因此无需进行强制转换。
答案 2 :(得分:1)
模数运算符在这里是非常宝贵的,因为它可以确定我们想要使用哪个座位。
首先,让我们考虑我们的假设并将它们转换为更抽象的东西:
现在,我们可以使用一些模数学来解决问题的其余部分。让我们现在宣布我们的座位数。
boolean[][] seats = new boolean[N][K]; //presumed
如果我们要申请13号席位,那么我们需要弄清楚两件事:
鉴于上述情况,该行的数学运算如下:
int row = (seatWanted % N)-1; // (13 % 10)-1 = 2.
现在,列也很容易找到 - 但我们会使用整数除法而不是模数。
int column = seatWanted / K; // 13 / 10 = 1.
其余部分是对读者的练习,但我们希望将seats[2][1]
标记为已拍摄。