0

2次元配列をトラバースしようとしています。現在、char 配列にクロスワード パズルを設定しており、文字の周囲の文字をチェックして、現在探している単語がその最初の文字に接続されているかどうかを確認できる必要があります。必要なジョブを実行するためにブール値メソッドが既に設定されていますが、現在のカウンターが配列の範囲外にあるかどうかを確認する方法があるかどうかを知りたいです。私の配列は次のようになります。

    W V E R T I C A L L 

    R O O A F F L S A B 

    A C R I L I A T O A 

    N D O D K O N W D C 

    D R K E S O O D D K 

    O E E P Z E G L I W 

    M S I I H O A E R A 

    A L R K R R I R E R 

    K O D I D E D R C D 

    H E L W S L E U T H 

私の現在のコードはこれです:

    public static boolean check(int row, int col, String word, char[][] puzzle) {       
    if(checkRight(row, col, word, puzzle)) return true;
    if(checkLeft(row, col, word, puzzle)) return true;
    if(checkUp(row, col, word, puzzle)) return true;
    if(checkDown(row, col, word, puzzle)) return true;
    if(checkNW(row, col, word, puzzle)) return true;
    if(checkNE(row, col, word, puzzle)) return true;
    if(checkSW(row, col, word, puzzle)) return true;
    if(checkSE(row, col, word, puzzle)) return true;
    return false;
}

private static boolean checkRight(int row, int col, String word, char[][] puzzle) {
    //Checking right direction
    for(int letter = 1; letter < word.length(); letter++) {
        if(puzzle[row][col + letter] != word.charAt(letter)) {
            return false;
        }
    }
    return true;
}


private static boolean checkLeft(int row, int col, String word, char[][] puzzle) {
    //Checking left direction
    for(int letter = 1; letter < word.length(); letter++) {
        if(puzzle[row + letter][col] != word.charAt(letter)) {
            return false;
        }
    }
    return true;
}


private static boolean checkUp(int row, int col, String word, char[][] puzzle) {
    //Checking up direction
    for(int letter = 1; letter < word.length(); letter++) {
        if(puzzle[row - letter][col] != word.charAt(letter)) {
            return false;
        }
    }
    return true;
}


private static boolean checkDown(int row, int col, String word, char[][] puzzle) {
    //Checking down direction
    for(int letter = 1; letter < word.length(); letter++) {
        if(puzzle[row][col - letter] != word.charAt(letter)) {
            return false;
        }
    }
    return true;
}


private static boolean checkSE(int row, int col, String word, char[][] puzzle) {
    //Checking diagonals direction
    for(int letter = 1; letter < word.length(); letter++) {
        if(puzzle[row + letter][col + letter] != word.charAt(letter) && <row<) {
            return false;
        }
    }
    return true;
}


private static boolean checkSW(int row, int col, String word, char[][] puzzle) {
    //Checking diagonals direction
    for(int letter = 1; letter < word.length(); letter++) {
        if(puzzle[row + letter][col - letter] != word.charAt(letter)) {
            return false;
        }
    }
    return true;
}

private static boolean checkNW(int row, int col, String word, char[][] puzzle) {
    //Checking diagonals direction
    for(int letter = 1; letter < word.length(); letter++) {
        if(puzzle[row - letter][col - letter] != word.charAt(letter)) {
            return false;
        }
    }
    return true;
}

private static boolean checkNE(int row, int col, String word, char[][] puzzle) {
    //Checking diagonals direction
    for(int letter = 1; letter < word.length(); letter++) {
        if(puzzle[row - letter][col + letter] != word.charAt(letter)) {
            return false;
        }
    }
    return true;
}
}

どんな助けでも大歓迎です!

4

2 に答える 2

2

すべての方向で機能する汎用関数が必要です。つまり、現在の位置に と を追加して、範囲内にある隣人の位置を計算offsetxoffsetyます[-1,1]。あなたが望むことをほとんど行うこのコードを見てください:

//This is your generic-direction function
public static boolean check(int row, int col, String word, char[][] puzzle, int offsetx, int offsety)

    //start with the current position
    int x = row;
    int y = col;

    for (int i = 0; i < word.lenth(); i++){
        //Is not equal
        if (puzzle[x][y] != word.charAt(i)) return false;

        //Calculate the next position
        x += offsetx;
        y += offsety;

        //check the boundaries, if we go out then we didn't find the word;
        if (x < 0 || x >= puzzle.length || y < 0 || y >= puzzle[x].length) return false;
    }

    return true;
}

そして、これが各方向を呼び出す方法です。

//check right
if(check(row, col, word, puzzle, 1, 0)) return true;

//check left
if(check(row, col, word, puzzle, -1, 0)) return true;

//check top
if(check(row, col, word, puzzle, 0, -1)) return true;

...

しかし、より簡単な方法は、このようにオフセットを配列で定義することです

//These are the offset you add to the current position
int [] movx ={-1, -1, -1, 0, 0, 1, 1, 1};
int [] movy ={-1, 0, 1, -1, 1, -1, 0, 1};

//this variable will hold if we found or not the string in the puzzle
boolean found = false;

//check all directions
for (int i = 0; i < 8; i++){
    //found the string, change the flag 'found' and break
    if(check(row, col, word, puzzle, movx[i], movy[i])){
        found = true;
        break;
    }
}

//string not found
if (!found){
    System.out.println("String not found");
}
于 2013-10-01T19:11:28.050 に答える
0

これは、チェック関数の呼び出しを制限することで解決できます。

例: 開始している文字が左端にない場合、左、斜め上と左、斜め上と右に単語があるかどうかを確認できます...それ以外の場合は文字の左側に何もないためです。上も下も右も同じです。

さらに、パズルが char[][] パズルの場合、 puzzle[0].length と puzzle.length はパズルの寸法を取得し、上限または開始点としてループなどをチェックする際に使用します。

于 2013-10-01T19:10:14.397 に答える