Напечатайте прямоугольник с диагоналями, используя двумерный массив в Java - PullRequest
0 голосов
/ 06 ноября 2018

Я пытался изменить обычный прямоугольный массив 2d, который выводится на консоль, чтобы показать его диагонали и другим символом. Например, мой текущий код для прямоугольника с двумерным массивом:

import java.util.Scanner;

class RecArray {
public static void main(String[] args) {
    Scanner scanner = new Scanner(System.in);
    System.out.print("Height: ");
    int height = scanner.nextInt();
    System.out.print("Width: ");
    int width = scanner.nextInt();


    char[][] square = new char[height][width];

    String line;

    // fill the array
    for (int i = 0; i < height; i++) {
      for (int j = 0; j < width; j++) {
        square[i][j] = 'o';
      }
    }

    // print the array
    for (int i = 0; i < height; i++) {
      line = "";
      for (int j = 0; j < width; j++) {
        line += square[i][j];
      }
      System.out.println(line);
    }
  }
}

и возвращается:

Height: 10
Width: 10
oooooooooo
oooooooooo
oooooooooo
oooooooooo
oooooooooo
oooooooooo
oooooooooo
oooooooooo
oooooooooo
oooooooooo

Я хочу вернуть мой диагональный код:

Height: 5
Width: 7
xooooox
oxoooxo
ooxxxoo
oxoooxo
xooooox

Мой текущий код:

 import java.util.Scanner;

    class RecArrayDiag {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        System.out.print("Height: ");
        int height = scanner.nextInt();
        System.out.print("Width: ");
        int width = scanner.nextInt();

        char[][] square = new char[height][width];
        boolean bool1 = true;
        boolean bool2 = true;
        boolean bool3 = true;
        boolean bool4 = true;
        String line;
        int x = 0;
        for (int i = 0; i < height; i++) {
            for (int j = width-1; j >= 0; j--) {
                if (i % 2 == 0 ? ((i == height/2)) : ((i == height-1/2))) {
                    bool1 = false;
                }
                if (j % 2 == 0 ? ((j == width/2)) : ((j == width-1/2))) {
                    bool2 = false;
                }

                if ((((i == j) && bool1 && bool2) || (i == (height - (j+1))) || (j == (width - (i+1))) || ((j == width-1) && bool3) || ((i == height-1) && bool4) || (j == width-1) && (i == height-1))) {
                    square[i][j] = 'x';
                    //x++;
                } else {
                    square[i][j] = 'o';
                }
                if ((j == width-1)) {
                    bool3 = false;
                }
                if ((i == height-1)) {
                    bool4 = false;
                }
            }
            x++;
        }

        // print the array
        for (int i = 0; i < height; i++) {
            line = "";
            for (int j = 0; j < width; j++) {
                line += square[i][j];
            }
            System.out.println(line);
        }
    }
}

И это возвращает:

Height: 5
Width: 7
xoooxox
oxoxoxo
ooxoxoo
oxoxooo
xoxooox

Пожалуйста, помогите мне в решении этой проблемы и заранее спасибо.

Ответы [ 2 ]

0 голосов
/ 06 ноября 2018

Насколько я понимаю, вы хотели бы показать какой-то крест. И вы хотите обработать случай, когда матрица не квадрат.

Это означает, что вы можете напрямую пройти из всех углов в центральную точку, и если одна ось сначала достигнет середины массива, просто остановите счетчик и перейдите ко второму параметру.

что-то в этом роде (просто псевдокод):

//create square with "o" everywhere then overwrite
int i = 0;
int j = 0;
while(i < height/2 || j < width/2){

    //go from all corners towards the middle
    if (i == j){
       square[i][j] = "x";
       square[i][width - j+1] = "x";
       square[height - i+1][j] = "x";
       square[height - i+1][width - j+1] = "x";
    } else if (i < height/2) { //i is in middle of array
       square[i][j] = "x";
       square[i][width - j+1] = "x";
    } else { //j is is in middle of array
       square[i][j] = "x";
       square[height - i+1][j] = "x";
    }

    //as long i and j did not reach the center add 1
    if (i < width/2) { i++ }
    if (j < height/2) { j++ }
}

Надеюсь, это немного поможет. В общем, я бы посоветовал разбить вашу проблему на разные части.

Я вижу логику в вашем решении, но постараюсь сделать его простым. Найти правила, которые работают, пока условие выполняется. (В этом случае: пока вы не находитесь в середине любого массива) Затем попробуйте найти решение для случаев, которые не соответствуют действительности. (например, что произойдет, если я достигну середины массива, а j - нет)

Таким образом, вы можете разбить свой код и сделать его намного легче читать / поддерживать.

В большинстве случаев, когда у вас есть огромные операторы if else, есть большая вероятность, что вы можете переписать их на более мелкие части.

0 голосов
/ 06 ноября 2018

Вот один из способов сделать это, используя метод многократного использования, разделяющий различные операции, применяемые к прямоугольнику.

public static void printRectangleWithDiagonals(int width, int height) {
    char[][] rectangle = new char[height][width];
    fill(rectangle, 'o');
    drawDiagonals(rectangle, 'x');
    print(rectangle);
}
private static void fill(char[][] rectangle, char ch) {
    for (char[] line : rectangle)
        for (int i = 0; i < line.length; i++)
            line[i] = ch;
}
private static void drawDiagonals(char[][] rectangle, char ch) {
    int bottom = rectangle.length - 1, right = rectangle[0].length - 1;
    if (right > bottom) {
        for (int x = 0; x <= right; x++) {
            int y = (x * bottom + right / 2) / right;
            rectangle[y][x] = ch;
            rectangle[bottom - y][x] = ch;
        }
    } else {
        for (int y = 0; y <= bottom; y++) {
            int x = (y * right + bottom / 2) / bottom;
            rectangle[y][x] = ch;
            rectangle[y][right - x] = ch;
        }
    }
}
private static void print(char[][] rectangle) {
    for (char[] line : rectangle)
        System.out.println(line);
}

Тест

printRectangleWithDiagonals(7, 7);
System.out.println();
printRectangleWithDiagonals(10, 4);
System.out.println();
printRectangleWithDiagonals(5, 9);

выход

xooooox
oxoooxo
ooxoxoo
oooxooo
ooxoxoo
oxoooxo
xooooox

xxooooooxx
ooxxxxxxoo
ooxxxxxxoo
xxooooooxx

xooox
oxoxo
oxoxo
ooxoo
ooxoo
oxoxo
oxoxo
xooox
xooox
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...