0

印刷すると次のように印刷される配列があります。

    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

次のように印刷するにはどうすればよいですか。

    # # # # # # # # # # # #

    # 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 #

    # # # # # # # # # # # #

余分な文字に対応するためにサイズを大きくしようとしましたが、範囲外の例外が発生し続けています。私は基本的に、配列の周りに境界線を作成するために文字以外の文字を取得しようとしています。これにより、クロスワードソルバーを実装するときに、周囲の文字で文字を検索するときに、境界にヒットせず、代わりに文字以外の文字にヒットしますそして false を渡します。

これは私の配列を構築する私のコードです:

    for (int i=1; i<row; i++){
        String getChar = (new String(sc.next()));
        for(int j = 1;j<col; j++){
            puzzle[i][j] = getChar.charAt(j);
            }
        }

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

編集:これは私の配列を出力します:

     for (int i=0; i<puzzle.length; i++){

           System.out.print(Arrays.toString(puzzle[i]));
           System.out.println("");
     }

EDIT2:これは私のチェック方法です:

    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

7 に答える 7

2

おそらくクラスまたは境界チェックを使用する必要がありますが、やりたいことを行う方法は次のとおりです。クロスワードがrow行とcol列であると仮定すると、タイプは puzzle である必要がありますchar[row+2][col+2]

String getChar = '';
for (int i=0; i<row+2; i++){
    if (i > 0 && i < row +1) {
       getChar = (new String(sc.next()));
    }
    for(int j = 0;j<col+2; j++){
        if (i % (row + 1) == 0 || i % (col + 1) == 0) {
            puzzle[i][j] = '#';
        else {
            puzzle[i][j] = getChar.charAt(j-1);
        }
    }
}

実際の動作を見たい場合は、ideone.comで確認してください。

rowプリインクリメントでそれを行うことについて尋ねたところcol、次のようになります。

for (int i=0; i<row; i++){
    if (i > 0 && i < row +1) {
       getChar = (new String(sc.next()));
    }
    for(int j = 0;j<col; j++){
        if (i % (row - 1) == 0 || j % (col - 1) == 0) {
            puzzle2[i][j] = '#';
        } else {
            puzzle2[i][j] = getChar.charAt(j-1);
        }
    }
}
于 2013-10-01T16:46:48.083 に答える
0

ネストされたループを使用する必要があります。まず、配列インデックスの開始が 1 のように、現在のコードで何も出力していないため、インデックスが 0 である最初の要素には何も配置されません。

public class BorderArray {
  public static void main(String[] args) {
    // Setup the puzzle, this may change or use input.
    //Assert that this string is 100 size length or row/col will not work.
    String chars = "WVERTICALLROOAFFLSABACRILIATOANDODKONWDCDRKESOODDKOEEPZEGLIWMSIIHOAERAALRKRRIRERKODIDEDRCDHELWSLEUTH";
    int row = 10, col = 10;
    char puzzle[][] = new char[row][col];
    for (int i = 0; i < row; i++) {
      for (int j = 0; j < col; j++) {
        puzzle[i][j] = chars.charAt(i + j);
      }
    }
    // You print the top border.
    // # # # # # # # # # # # # ... print '#' col+2 times
    for (int j = 0; j <= col; j++) {
      System.out.print("# "); // inline
    }
    System.out.println("# "); // move to next line

    // # W V E R T I C A L L # ... print '#' before and after the characters of the row
    // start i at 0 since arrays start at 0
    for (int i = 0; i < row; i++) {
      // for every row print chars of every column inline
      System.out.print("# "); // before
      for (int j = 0; j < col; j++) {
        System.out.print(puzzle[i][j] + " "); // print every char
      }
      System.out.println("#"); // after and next line
    }

    // Bottom border
    // # # # # # # # # # # # # ... print '#' col+2 times, you don't need new line since this is the end.
    // Just use col+1 as limit of the loop.
    for (int j = 0; j <= col + 1; j++) {
      System.out.print("# ");
    }

  }
}
于 2013-10-01T16:51:25.293 に答える
0

シンプルです。配列に組み込まないでください。とにかく実際のデータではなく、「プレゼンテーションレイヤー」です。

private void printFullBorder(int col) { 
    for (int x=0; x<col+2; x++) {  //+2 because there are the leftmost + rightmost to account for
        System.out.print("#");  //unclear if this should be "#" or " #" based on your formatting, but whatever.
    }
}

printFullBorder(col);
for (int i=0; i<puzzle.length; i++){
    System.out.print("#" + Arrays.toString(puzzle[i]) + "#");
    System.out.println("");
}
printFullBorder(col);
于 2013-10-01T16:59:41.723 に答える
0

私は Java プログラマーではありませんが、Java 配列のインデックスは C のように 0 から始まると思っていました。したがって、10x10 になるようにパズルを作成してから puzzle[1][10] にアクセスしようとすると、「例外」が発生します。 : 範囲外」エラー。つまり、パズルは puzzle[1][1] から puzzle[10][10] にはなりません。puzzle[0][0] から puzzle[9][9] に行きます。これが間違っている場合は、Java プログラマーが訂正してください。

于 2013-10-01T16:51:03.513 に答える
0
public static String[] addBorder(String picture[]) {
    String[] border = new String[picture.length + 2];
    String pattern = "";
    for (int i = 0; i <= picture[0].length() + 1; i++) {
        pattern = pattern.concat("#");
    }
    border[0] = pattern;
    border[border.length - 1] = pattern;

    for (int i = 1; i <= border.length - 2; i++) {
        border[i] = "#" + picture[i - 1] + "#";
    }

    return border;
}
于 2020-05-02T13:18:52.743 に答える