我正在制作一个游戏,我需要创建一个方法来检查指定的单元格是否是包含相同字符的水平连续单元格序列的一部分。单元序列的长度必须为 l。如果单元格是长度至少为 l 的水平序列的一部分,则为真,否则为假。
到目前为止,我可以检测到在指定字符的行中是否有至少 5 个具有相同字符的连续单元格。任何人都可以帮忙吗?
我正在制作一个游戏,我需要创建一个方法来检查指定的单元格是否是包含相同字符的水平连续单元格序列的一部分。单元序列的长度必须为 l。如果单元格是长度至少为 l 的水平序列的一部分,则为真,否则为假。
到目前为止,我可以检测到在指定字符的行中是否有至少 5 个具有相同字符的连续单元格。任何人都可以帮忙吗?
您可以使用两个循环(每侧一个)简单地搜索两侧并检查连续单元格的总和是否确实为l
. 类似于以下内容:
public static boolean checkPositionRow(char[][] a, int row, int col, int l) {
int counter = 1; //starting from 1, because for a[row][col] itself
char charAtPosition = a[row][col];
//expand to the right as much as possible
for (int i = col+1; i < a[row].length && a[row][i] == charAtPosition; i++) counter++;
//expand to the left as much as possible
for (int i = col-1; i >= 0 && a[row][i] == charAtPosition; i--) counter++;
return counter >= l;
}
假设您要包含的列是 - 5
。并且序列的长度是3
。
现在,以下是您的序列在该行中出现的可能性:-
Col = (5 - 2) to 5
Col = 5 to (5 + 2)
(5 - 2), (5 + 2)
或者,范围 [ ]之间的任何位置因此,您感兴趣的范围是: - [col - length + 1, col + length - 1]
。在此范围内,每个长度序列都3
将包括您的 column 5
。
因此,只需在这些范围之间运行循环。现在,问题将是当这些范围超出范围时。所以,你可以先做那个检查。
更好的方法是使用Math.max(0, col-length+1)
, 和Math.min(col + length-1, arraylength)
。
所以,你可以使用这个for-loop
: -
public static boolean checkPositionRow(char[][] a, int row, int col, int l) {
int counter = 0;
int left = col - l + 1;
int right = col + l - 1;
char charAtPosition = a[row][col];
for (int i = Math.max(0, left); i < Math.min(right, a[row].length); i++) {
if (a[row][i] == charAtPosition) {
counter++;
if (counter >= l)
return true;
} else {
counter = 0;
}
}
}