Member 13709550 Ответов: 1

Как я понимаю этот альгоритм


Здравствуйте, я нашел этот алгоритм для решения лабиринтов, но я не понимаю, что такое "перемещение по лабиринту". Может ли кто-нибудь мне это объяснить?

Спасибо.

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

#.###########
#.#.........#
#.###.#.###.#
#...#.#...#.#
#.#########.#
#...........#
#######.#####
#.......#.#.#
###.#.###.#.#
#...#...#...#
#####.#####.#
#.........#.#
###########.#
----
#.###############
#.......#...#...#
#.###.###.#####.#
#.#.#...........#
###.###.###.###.#
#.#.......#...#.#
#.#.#############
#...........#...#
###.###.###.#.###
#.#.#.....#.....#
#.#.###.###.#.#.#
#...#.....#.#.#.#
###.#.###.#.#####
#.#.#...#.#.....#
#.###.###.###.#.#
#.......#.#...#.#
###############.#
----
#.###############
#.......#...#...#
#.###.###.#####.#
#.#.#.....#.....#
###.###.###.###.#
#.#.......#...#.#
#.#.#######.###.#
#...........#...#
###.###.#####.###
#.#.#.....#.....#
#.#.###.###.#.#.#
#...#.....#.#.#.#
###.#.###.#.#####
#.#.#...#.#.....#
#.#.#.###.###.#.#
#.......#.#...#.#
###############.#


Что я уже пробовал:

#include <stdio.h>

int width;
int height;
int X;
int Y;
char maze[200][200];

/* # stands for walls
   . stands for ways
   o stands for out found path
*/

//      WALLS

int Wall(int *x, int *y)
{
  return maze[*y][*x] == '#';
}



//      MOVEMENT DIRECTIONS

int Up(int *x, int *y)
{
  if(--(*y) < 0 || Wall(x, y))
  {
    (*y)++;
    return 0;
  }
  return 1;
}


int Down(int *x, int *y)
{
  if(++(*y) >= height || Wall(x, y))
  {
    (*y)--;
    return 0;
  }
  return 1;
}


int ToRight(int *x, int *y)
{
  if(++(*x) >= width || Wall(x, y))
  {
    (*x)--;
    return 0; 
  }
  return 1; 
}


int ToLeft(int *x, int *y)
{
  if(--(*x) < 0 || Wall(x, y))
  {
    (*x)++;
    return 0;
  }
  return 1;
}


//      MOVING THROUGH THE MAZE


int Movement(int x, int y, int direction, int loop)    //x&y where we actually are, direction where we came from and loop which loop we are doing
{
  if(loop > 20000)   
    return 0;     

  int i;
  int oposite_direction = (direction+2)%4;

  switch(direction)     
  {
  case 0:
    if(ToRight(&x, &y) == 0)
      return 0;
    break;
  case 1:
    if(Up(&x, &y) == 0)
      return 0;
    break;
  case 2:
    if(ToLeft(&x, &y) == 0)
      return 0;
    break;
  case 3:
    if(Down(&x, &y) == 0)
      return 0;
    break;
  }

  if(x == width - 2 && y == height-1)     
  {
    maze[y][x] = 'o';
    return 1;     
  }


  for(i=0; i<4; ++i)    
  {
    if(i != oposite_direction)
    {
      if(Movement(x, y, i, loop+1))
      {
        maze[y][x] = 'o';
        switch(direction)
        {
        case 0:
          ToLeft(&x, &y);
          break;
        case 1:
          Down(&x, &y);
          break;
        case 2:
          ToRight(&x, &y);
          break;
        case 3:
          Up(&x, &y);
          break;
        }

        return 1;
      }
    }
  }
  return 0;
}

int main()
{
  while(1)    
  {
    for(Y=0; Y<=200; ++Y)
    {
      scanf("%s",maze[Y]); 

      if(maze[Y][0] == '-' || maze[Y][0] == '\0')
        break;
    }

    height = width = Y;

    
    if(Movement(1,-1,3,0) == 0)    
    {
      printf("There is no path out of this maze\n");
      printf("----\n");
      continue;
    }


    for(Y=0; Y<height; ++Y)
    {
      printf("%s",maze[Y]);
      printf("\n");
    }
          if ((maze[Y][0] != '\0'))
            printf("----\n");

    if(maze[Y][0] == '\0')
      break;
  }

  return 0;
}

1 Ответов

Рейтинг:
1

Patrice T

Один из способов понять, как работает алгоритм, - это увидеть, как он работает.
Добавьте некоторый код для отображения лабиринта по мере того, как алгоритм его решает. Не забудьте указать фактическую позицию.

if(Movement(x, y, i, loop+1))
{
  maze[y][x] = 'o';
  switch(direction)
  {
  case 0:
    ToLeft(&x, &y);
    break;
  case 1:
    Down(&x, &y);
    break;
  case 2:
    ToRight(&x, &y);
    break;
  case 3:
    Up(&x, &y);
    break;
  }
  // add code here to display the maze
  return 1;

Если вы не видите то, что хотите, перемещайте код вокруг, пока не увидите.
-----
Второй вариант-использовать отладчик, чтобы увидеть, как выполняется код:
Ваш код ведет себя не так, как вы ожидаете, и вы не понимаете, почему !

Существует почти универсальное решение: запускайте свой код на отладчике шаг за шагом, проверяйте переменные.
Отладчик здесь, чтобы показать вам, что делает ваш код, и ваша задача-сравнить с тем, что он должен делать.
В отладчике нет никакой магии, он не знает, что вы должны делать, он не находит ошибок, он просто помогает вам, показывая, что происходит. Когда код не делает того, что ожидается, вы близки к ошибке.
Чтобы увидеть, что делает ваш код: просто установите точку останова и посмотрите, как работает ваш код, отладчик позволит вам выполнять строки 1 на 1 и проверять переменные по мере их выполнения.

Обратная сторона этого решения:
- Это DIY, вы один отслеживаете проблему и находите ее корни, которые ведут к решению.
Положительная сторона этого решения:
- Это также отличный инструмент обучения, потому что он показывает вам реальность, и вы можете увидеть, какие ожидания соответствуют реальности.
Отладчик - Википедия, свободная энциклопедия[^]

Освоение отладки в Visual Studio 2010 - руководство для начинающих[^]
Базовая отладка с помощью Visual Studio 2010 - YouTube[^]
1.11 — отладка программы (пошаговое выполнение и останова) | выучить C++[^]
Отладчик здесь только для того, чтобы показать вам, что делает ваш код, и ваша задача-сравнить его с тем, что он должен делать.