0

ゲームを作成していますが、指定されたセルが、同じ文字を含むセルの水平連続シーケンスの一部であるかどうかをチェックするメソッドを作成する必要があります。セルのシーケンスは長さ l である必要があります。セルが長さ l 以上の水平シーケンスの一部である場合は true、それ以外の場合は false。

これまでのところ、指定された文字の行のどこかに同じ文字を持つ連続したセルが少なくとも 5 つあるかどうかを検出することができました。誰でも助けることができますか?

4

2 に答える 2

1

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;
}
于 2012-12-03T22:37:21.967 に答える
1

含める列が - であるとします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;
        }
  }
}
于 2012-12-03T22:47:06.587 に答える