0

単語検索パズルで「ruby」、「python」、「java」を検索するプログラムがあります。私の教授は、左から右に検索するコードを教えてくれましたが、右から左、斜めに検索する方法がわかりません。他の人が同じ問題をコーディングしているのを見たことがありますが、私の教授は、彼女が行ったのと同様の方法でそれを行うことを望んでいると思います。

右から左に移動しようとしましたが、範囲外の例外が発生するか、検索が否定的に返されます。

public static void main (String[] argv)
{
    char[][] puzzle = {
        {'n', 'o', 'h', 't', 'y', 'p', 's'},
        {'m', 'i', 'a', 'r', 'y', 'c', 'c'},
        {'l', 'l', 'e', 'k', 's', 'a', 'h'},
        {'r', 'u', 'b', 'y', 'v', 'm', 'e'},
        {'e', 'h', 'h', 'a', 'l', 'l', 'm'},
        {'p', 'c', 'j', 'n', 'i', 'c', 'e'},
        {'r', 'e', 'e', 'k', 'b', 'i', 'p'}
    };

    String result1 = findWordLefttoRight (puzzle, "ruby");
    String result2 = findWordRighttoLeft (puzzle, "python");
    //String result3 = findWordBottomLefttoTopRight (puzzle, "java");
    System.out.println (result1);
    System.out.println (result2);
    //System.out.println (result3);
}

/*Given by Professor*/

static String findWordLefttoRight (char[][] puzzle, String word)
{
// First convert the String into a char array.
char[] letters = word.toCharArray ();

// Now try every possible starting point in the puzzle array.
for (int i=0; i<puzzle.length; i++) {
    for (int j=0; j<puzzle[i].length; j++) {

    // Use (i,j) as the starting point.
    boolean found = true;

    // Try to find the given word's letters.
    for (int k=0; k<letters.length; k++) {
        if ( (j+k >= puzzle[i].length) || (letters[k] != puzzle[i][j+k]) ) {
        // Not a match.
        found = false;
        break;
        }
    }

    // If we went the whole length of the word, we found it.
    if (found) {
        return "String " + word + " found in row=" + i + " col=" +j;
    }

    }
}

return "String " + word + " not found";
}

/* My attempt at going from right to left */

static String findWordRighttoLeft (char[][] puzzle, String word)
{
// First convert the String into a char array.
char[] letters = word.toCharArray ();

// Now try every possible starting point in the puzzle array.
for (int i=puzzle.length; i>0; i--) {
    for (int j=puzzle.length; j>0; j--) {

    // Use (i,j) as the starting point.
    boolean found = true;

    // Try to find the given word's letters.
    for (int k=0; k<letters.length; k++) {          
        if ( (j+k <= puzzle.length) || (letters[k] == puzzle[i][j+k]) ) { 
        // Not a match.
        found = false;
        break;
        }
    }

    // If we went the whole length of the word, we found it.
    if (found) {
        return "String " + word + " found in row=" + i + " col=" +j;
    }

    }
}

return "String " + word + " not found";
}
4

2 に答える 2

0

以下の条件は範囲外の例外を引き起こします

(letters[k] != puzzle[i][j+k])

どこ

J max value can be puzzle[i].length  and
k max value can be letters.length

両方を追加してそのインデックスをチェックしていたため、例外が発生しています。最大値は puzzle[i].length のみです

注: findWordLefttoRight ロジックも正しくありません。同じ問題が存在します。また、範囲外の例外が発生します

于 2013-09-14T16:34:40.307 に答える
0

パズルの行列を紙 (ある場合は方眼紙) に書き、各行と列のインデックスを行列のサイズに付けます。左から右に行列を検索するために使用しているネストされた for ループを見て、コメントで始まり、//Now try every possible starting point in the puzzle array紙にある行列を検索する方法を理解してください。次に、右から左に検索する方法を見て、マトリックスを右から左にトラバースするようにコードを変更する方法を決定します。それを解決したら、対角線についても同じことを行います。対角線には 4 つのケースがあることに注意してください。

  1. 左上から右下へ
  2. 左下から右上へ
  3. 右上から左下
  4. 右下から左上

英語の読者にとっては、ケース #1 のように斜めに行う方がおそらくより直感的であるため、まずそれから始めて、問題の理解を深めてください。

OutOfBounds エラーの場合は、コードにデバッグ ステートメントを追加します (または、IDE デバッガーの使用方法を学習することをお勧めします)。これにより、for ループがどのように動作しているか、どこが行き過ぎているかを理解できます。

于 2013-09-14T16:30:24.063 に答える