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

Это ошибка Вальгринда. Во-первых, -fsanitize=leak ничего не показывает. Во-вторых, сам Valgrind утверждает , что:

Прежде всего: расслабьтесь, это, вероятно, не ошибка, а функция. Многие реализации стандартных библиотек C ++ используют свои собственные распределители пула памяти. Память для целого ряда разрушенных объектов не сразу освобождается и возвращается обратно в ОС, а хранится в пулах (-ях) для последующего повторного использования. Тот факт, что пулы не освобождаются при выходе из программы, заставляет Valgrind сообщать об этой памяти по-прежнему доступной. Поведение не для свободных пулов на выходе может быть названо ошибкой библиотеки.

Используя GCC, вы можете заставить STL использовать malloc и освободить память как можно скорее, глобально отключив кеширование памяти , Осторожно! Это может замедлить вашу программу, иногда резко.

С GCC 2.91, 2.95, 3.0 и 3.1 скомпилируйте весь источник, используя STL с -D__USE_MALLOC. Осторожно! Это было удалено из GCC, начиная с версии 3.3.

С GCC 3.2.2 и более поздними версиями вы должны экспортировать переменную среды GLIBCPP_FORCE_NEW перед запуском вашей программы.

С GCC 3.4 и более поздними версиями, эта переменная изменила имя на GLIBCXX_FORCE_NEW.

[...]

Я предполагаю, что предполагаемые пулы памяти освобождены после завершения программы в так называемом стартовом коде, который вызывает main среди других настроек. Внутренние функции, определенные вне кода пользователя, должны обрабатываться так, как если бы они не существовали, поэтому Valgrind не может (и не должен) видеть дополнительные освобождения.

0
задан princess_bella 2 March 2019 в 21:59
поделиться

1 ответ

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

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

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

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

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

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

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

Я добавил логическое значение, которое печатает отдельные шаги, если установлено значение 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
0
ответ дан kai 2 March 2019 в 21:59
поделиться
Другие вопросы по тегам:

Похожие вопросы: