Как я могу сделать этот критерий остановки эффективным? - PullRequest
1 голос
/ 14 ноября 2010

Я не знаю, почему этот критерий остановки продолжает терпеть неудачу, но я считаю, что это как-то связано с логическим или (||). Я отладил, и он, кажется, не останавливается там, где я хочу, который включается, когда cp (текущая позиция) находится по периметру массива.

 if(cp == start || (cp.getColumn() > 0 || cp.getColumn() < maze[0].length-1 || cp.getRow() > 0 || cp.getRow() < maze.length+1)){`

Это алгоритм решения лабиринта. По сути, лабиринт представляет собой двумерный массив, состоящий из X для стен. Каждая ячейка с X - это стена, и «текущая позиция» не может получить к ней доступ. Миссия «текущей позиции» состоит в том, чтобы выбраться из лабиринта, что означает, что он должен находиться либо в первом или последнем столбце, либо в первом из последнего ряда. Алгоритм работает очень хорошо, но просто не распознает, когда текущая позиция находится в индексе выхода.

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

Ответы [ 5 ]

1 голос
/ 14 ноября 2010

Итак, ни одна из следующих вещей не является правдой:

  • cp == начало
  • cp.getColumn ()> 0
  • cp.getColumn () <лабиринт [0]. Длина - 1 </li>
  • cp.getRow ()> 0
  • cp.getRow () <длина лабиринта + 1 </li>

Но вы думаете (по крайней мере), один из них должен быть правдой. Какой?

0 голосов
/ 14 ноября 2010

Похоже, вы используете условия запуска в вашем наборе ИЛИ. Вы можете положить! (Не) перед первой скобкой. Как написано, я думаю, что условие else будет иметь место, где должна произойти ваша остановка.

Рассмотрите возможность упаковки кода обработки в этом операторе if.

Стол проверьте свою логику, чтобы увидеть, когда вы выходите. Помните, что ИЛИ останавливает обработку при первом ИСТИНА и И прекращает обработку при первом ЛОЖЬ.

0 голосов
/ 14 ноября 2010

Я не уверен, что вы правильно скопировали свой код

 if(cp == start 
        || (cp.getColumn() > 0 || cp.getColumn() < maze[0].length-1 
        || cp.getRow() > 0 || cp.getRow() < maze.length+1)) {

Для простоты понимания представьте, что maze.length [0] -1 оценивается, скажем, в 3, а затем рассмотрите этот бит:

cp.getColumn() > 0 || cp.getColumn() < 3

Это будет верно для каждого значения cp.getColumn (), попробуйте, скажем, 8, да, больше 0, -99, да, это меньше 3. Держу пари, что вы имели в виду

cp.getColumn() > 0 && cp.getColumn() < 3

это будет верно, если столбец находится в лабиринте.Если вы хотите проверить выход из лабиринта:

cp.getColumn() <= 0 || cp.getColumn() >= 3 

(примечание, которое я использую <= 3, а не просто == 3 намеренно, это касается случаев, таких как перемещение более чем на один шаг.)</p>

Если вы хотите проверить, находится ли он в лабиринте, у вас есть

 if(cp == start 
        || (
             cp.getColumn() > 0 && cp.getColumn() < columnCount 
             && cp.getRow() > 0 && cp.getRow() < rowCount)) {

, если вы хотите проверить, находится ли он за пределами лабиринта

 if(cp != start 
        && (
             cp.getColumn() <= 0 || cp.getColumn() >= columnCount 
             || cp.getRow() <= 0 || cp.getRow() >= rowCount)) { 
0 голосов
/ 14 ноября 2010

Я действительно не вижу, что вы пытаетесь сделать здесь, но предполагая, что 'лабиринт' - это двумерный массив, он, вероятно, должен быть maze.length-1 в последнем сравнении. Однако это сделало бы оператор if равным true, если cp НЕ находится по периметру массива.

0 голосов
/ 14 ноября 2010

Существо или утверждения, что дополнительный набор скобок излишни:

if(cp == start || cp.getColumn() > 0 || cp.getColumn() < maze[0].length-1 || cp.getRow() > 0 || cp.getRow() < maze.length+1){

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

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