Java 2D массив (прямоугольная матрица) сумма траектории диагональных перемещений, пока вы не столкнетесь с стеной, повторяйте, пока не достигнете угла - PullRequest
0 голосов
/ 03 марта 2019

Мне нужна помощь в решении следующей проблемы, я застрял на ней целых 2 дня.

"Мне даны числа a и b. Они образуют матрицу степеней 2. Вы.Начните с верхнего левого угла матрицы и двигайтесь по диагонали, пока не ударитесь о стену. При ударе по стене вы меняете направление. Делайте это до тех пор, пока направление больше не может быть изменено, то есть вы попали в угол. Найтисумма этого пути. "

До сих пор я создал матрицу, заполнил ее числами и создал 2 логических значения для 1. при нажатии на угол и 2. при нажатии на стену.У меня было несколько идей, как продолжить, но ни одна из них не сработала.

for (int row = 0; row < a; row++) {
            for (int col = 0; col < b; col++) {

                boolean cornerHit = (row == 0 && col == 0) || (row == 0 && col == b - 1) ||
                        (row == a - 1 && col == b - 1) || (row == a - 1 && col == 0);

                boolean hitWall = (row == 0 && (col > 0 && col < b - 1)) ||
                        (col == 0 && (row > 0 && row < a - 1)) ||
                        (row == a - 1 && (col > 0 && col < b - 1)) ||
                        (col == b - 1 && (row > 0 && row < a - 1));

Пример: если a = 3 и b = 4.

вот как выглядит матрица и диагональное движение для a = 3, b = 4 Путь будет 1 4 16 16 4 4 4 и сумма 49. Пожалуйста, помогите!:))

1 Ответ

0 голосов
/ 03 марта 2019

Идея довольно проста.По сути, вы должны идти, пока не дойдете до угла.Это конструкция do / while.

Мы начинаем в верхнем левом углу, поэтому наша начальная позиция - posx = 0 и posy = 0.На каждом шаге мы должны двигаться на одну (1) вправо и одну вниз (1), поэтому в направлении x мы имеем deltax = 1, а в направлении y deltay = 1 для каждого движения.

Если aударили о стену, мы должны изменить направление.

ударили о стену в направлении y, если posy = 0 (вверху) или posy имеет размер 1 (нижний столбец), в этом случае дельтай изменяет свой знак: deltay = -deltay.

То же самое для x: стена в направлении x удаляется, если posx = 0 (слева) или posx имеет размер-1 (крайний правый столбец), в этом случае deltax меняет свой знак: deltax = -deltax.

Для простоты я сделал sizex-1 и sizey-1 в самом начале (sizex--; sizey--;), поэтому тест просто проверяет размер.

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

Я добавил логическое значение, которое печатает отдельные шаги, если установлено значение true.

[Может быть, вы хотите добавить дополнительную проверку для недопустимых прямоугольников, таких как diagonalWalk (-1, -1)] *

public static int diagonalWalk(int sizex, int sizey, boolean showSteps) {
    int posx = 0;
    int posy = 0;
    int sum = 1;
    int deltay = 1;
    int deltax = 1;
    sizex--;//valid cols are: 0 - sizex-1
    sizey--;//valid rows are: 0 - sizey-1
    if (showSteps) {
        System.out.println("At: 0/0:1");
    }
    do {
        posx += deltax;
        posy += deltay;
        sum += Math.pow(2, posx) * Math.pow(2, posy);
        if (showSteps) {
            System.out.println("At: " + posy + "/" + posx + ":" + Math.pow(2, posx) * Math.pow(2, posy));
        }

        //wallhit left or right
        if (posx == 0 || posx >= sizex) {
            deltax = -deltax;
        }
        //wallhit top or bottom
        if (posy == 0 || posy >= sizey) {
            deltay = -deltay;
        }
    }while(!((posx == 0 || posx >= sizex) && (posy == 0 || posy >= sizey)));
    return sum;
}

/**
 * @param args the command line arguments
 */
public static void main(String[] args) {
    int sum = diagonalWalk(3,4, true);
    System.out.println("result is:" + sum);
}

пример выполнения:

At: 0/0:1
At: 1/1:4.0
At: 2/2:16.0
At: 3/1:16.0
At: 2/0:4.0
At: 1/1:4.0
At: 0/2:4.0
result is:49
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...