ゲームを作成していますが、指定されたセルが、同じ文字を含むセルの水平連続シーケンスの一部であるかどうかをチェックするメソッドを作成する必要があります。セルのシーケンスは長さ l である必要があります。セルが長さ l 以上の水平シーケンスの一部である場合は true、それ以外の場合は false。
これまでのところ、指定された文字の行のどこかに同じ文字を持つ連続したセルが少なくとも 5 つあるかどうかを検出することができました。誰でも助けることができますか?
ゲームを作成していますが、指定されたセルが、同じ文字を含むセルの水平連続シーケンスの一部であるかどうかをチェックするメソッドを作成する必要があります。セルのシーケンスは長さ l である必要があります。セルが長さ l 以上の水平シーケンスの一部である場合は true、それ以外の場合は false。
これまでのところ、指定された文字の行のどこかに同じ文字を持つ連続したセルが少なくとも 5 つあるかどうかを検出することができました。誰でも助けることができますか?
2 つのループ (各サイドに 1 つ) を使用して両側を単純に検索し、連続するセルの合計が実際に であるかどうかを確認でき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
列が含まれます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;
}
}
}