Как я могу исправить свое исключение за пределами границ в моем рекурсивном лабиринте бэктрекера? - PullRequest
0 голосов
/ 28 апреля 2018

Мои ячейки имеют координаты. Моя проблема в том, что когда моя текущая ячейка является граничной, а мой случайно выбранный сосед находится за пределами границы, я получаю исключение. Как мне помешать этому методу смотреть за границы? Я попытался добавить x и y, а затем проверить, что сумма x и y меньше нуля, затем вырваться из случая переключения и начать все заново, ища соседнюю ячейку, которая существует.

public void generate(Maze mz) {
    Random rand = new Random();

    // generate a x * y grid of cells
    StdDraw.setXscale(0, 10);
    StdDraw.setYscale(0, 10);

    // start at initial cell and push it to the stack
    Coord currentCell = new Coord(0,0);
    stack.push(currentCell);

    int remaining = 1;
    while(remaining <= mz.getCols() * mz.getRows()) {
        // check if currentCell's neighbors have been visited
        loop: if(!stack.contains(currentCell.getNeighbor(Direction.NORTH)) || !stack.contains(currentCell.getNeighbor(Direction.WEST)) || !stack.contains(currentCell.getNeighbor(Direction.SOUTH)) || !stack.contains(currentCell.getNeighbor(Direction.EAST))) {
            // choose a random neighbor
            // TODO: special case when cell is on the border
            int randomDirection = rand.nextInt(4);
            switch(randomDirection) {
            case 0:
                int x0 = currentCell.getNeighbor(Direction.NORTH).getCol();
                int y0 = currentCell.getNeighbor(Direction.NORTH).getRow();
                int sum0 = x0 - y0;
                if(sum0 < 0) {
                    break loop;
                }
                mz.setExit(currentCell, Direction.NORTH, true);
                currentCell = currentCell.getNeighbor(Direction.NORTH);
                stack.push(currentCell);
                remaining++;
                break;
            case 1:
                int x1 = currentCell.getNeighbor(Direction.WEST).getCol();
                int y1 = currentCell.getNeighbor(Direction.WEST).getRow();
                int sum1 = x1 - y1;
                if(sum1 < 0) {
                    break loop;
                }
                mz.setExit(currentCell, Direction.WEST, true);
                currentCell = currentCell.getNeighbor(Direction.WEST);
                stack.push(currentCell);
                remaining++;
                break;
            case 2:
                int x2 = currentCell.getNeighbor(Direction.SOUTH).getCol();
                int y2 = currentCell.getNeighbor(Direction.SOUTH).getRow();
                int sum2 = x2 - y2;
                if(sum2 < 0) {
                    break loop;
                }
                mz.setExit(currentCell, Direction.SOUTH, true);
                currentCell = currentCell.getNeighbor(Direction.SOUTH);
                stack.push(currentCell);
                remaining++;
                break;
            case 3:
                int x3 = currentCell.getNeighbor(Direction.EAST).getCol();
                int y3 = currentCell.getNeighbor(Direction.EAST).getRow();
                int sum3 = x3 - y3;
                if(sum3 < 0) {
                    break loop;
                }
                mz.setExit(currentCell, Direction.EAST, true);
                currentCell = currentCell.getNeighbor(Direction.EAST);
                stack.push(currentCell);
                remaining++;
                break;
            }
        } else {
            currentCell = stack.peek();
            stack.pop();
        }
    }
}

1 Ответ

0 голосов
/ 28 апреля 2018

При рассмотрении граничных условий применяется техника защиты от возможного перемещения за пределы.

Четыре граничных условия:

  • Север: вы можете двигаться на север, если вы еще не в верхнем ряду
  • Юг: вы можете двигаться на юг, если вы еще не в нижнем ряду
  • Восток: вы можете двигаться на восток, если вы еще не находитесь на самой правой стороне.
  • Запад: Вы можете переместиться на запад, если вы еще не находитесь в левом краю

В переводе на код это может выглядеть примерно так:

case 0:  // Want to move North
    // To move north, must be below the top row
    int curRow = currentCell.getRow();
    if(curRow == 0) {   // Assuming top row is assigned to zero
        break loop;
    }

В качестве альтернативы, что-то вроде:

case 0:  // Want to move North
    // To move north, must be below the top row
    int curRow = currentCell.getRow();
    if(curRow > 0) {   // Assuming top row is assigned to zero
        // Process the move NORTH
    }

Корпус для ЮГА аналогичен if (curRow < MAXROW) { .. process ... }

Для EAST / WEST действительные ходы основаны на текущем столбце.

...