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 #

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

我已经尝试将尺寸变大以容纳额外的字符,但我不断遇到异常。我基本上试图让一个非字母字符在我的数组周围创建一个边框,这样当我实现我的填字游戏求解器时,在周围的字母中搜索一个字母时,它不会击中边界,而是击中非字母字符然后传递假。

这是我构建我的数组的代码:

    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

4

而不是做一个边框,只需检查你要检查的位置是否在数组之外,如果是,那么你知道你不会找到整个单词,因为我们必须在数组之外.

例如,您的数组是n x n,如果您尝试访问位置,n那么它将超出范围,或者如果您尝试访问小于 0 的位置,它也将超出范围。所以只要确保你访问它的时候在这个范围内。

于 2013-10-01T16:41:59.040 回答
2

您可能应该使用类或边界检查,但这里是如何做您想做的事情。假设你的填字游戏是row行和col列,你需要拼图是 type 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上查看。

你问过使用rowcol预递增,它看起来像这样:

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 回答
1
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);
    }
}

顺便说一句:请记住,Java 中的索引从 0(而不是 1)开始。在您的示例中,您从 1 迭代到最大列长度,这就是为什么您可以获得IndexOutOfBoundsException

于 2013-10-01T16:45:26.180 回答
0

我不是Java程序员,但我认为Java数组索引从零开始,就像C一样。所以,如果你把puzzle设置为10x10,然后尝试访问puzzle[1][10],你会得到一个“异常: 越界”错误。也就是说,拼图不会从拼图[1][1] 到拼图[10][10]。它从拼图[0][0] 到拼图[9][9]。如果这不正确,请 Java 程序员更正。

于 2013-10-01T16:51:03.513 回答
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
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 回答