условия поиска пути def - PullRequest
       4

условия поиска пути def

1 голос
/ 04 декабря 2009

Хорошо, поэтому мне пришлось взломать Heineken для этого. Попытка решить проблему кратчайшего пути с помощью текстового файла.

Мое исследование привело меня к: текст ссылки текст ссылки довольно хорошая информация для моего алгоритма

Обычно я пытаюсь начать с 'S' для начала и выйти из 'F' для завершения или вернуть сообщение о решении не получено

два самопровозглашенных теста или текстовых файла, которые рассматриваются

      ##########
      #S       #
      ######   # 
      #F       #
      ##########

      and non-solvable

      ##########
      #S       #
      ########## 
      #F       #
      ##########

Моя проблема в том, что у меня проблемы с написанием определения пути для этого и возвращением его в пользовательский формат печати. Ниже приведен код для всей этой проклятой вещи. Как и моя первая попытка. Пространства свободны, чтобы быть путем. Стены определяются как любой другой ключ, кроме пробела. Также обратите внимание, что мой цикл while для выхода вернет ошибку, я работаю над этим прямо сейчас.

  puts "enter a file name (example maze1.mz) PRESS ENTER" 
  filename = gets.chomp.to_s
  while filename != 'quit' do


  def read_maze( filename )
  local_maze = []
  mz_file = File.open(filename,"r")

  while ! mz_file.eof? do
  line = mz_file.gets.chomp
  local_maze << line.scan(/./)
  end

  mz_file.close
  return local_maze
  end

  def solve_maze(row, column, blank_spot, blank_spot_not ) #parse throug args
  #from http://en.wikipedia.org/wiki/Maze
  #from http://en.wikipedia.org/wiki/Pathfinding


  return unless self[column][row]   #condition for its full
  return if self[column][row] != space #condition for printable spot
  return if self[column][row] == blank_spot_not #can't use this spot
  return if self[column][row]== full or f encountered
  #maze is full can't solve or finished
  self[column][row] = blank_spot_not

  #direction up down left right
  solve_maze(column+1, row, space, blank_spot_not) #right
  solve_maze(column-1, row, space, blank_spot_not) #left
  solve_maze(column, row+1, space, blank_spot_not) #up
  solve_maze(column, row-1, space, blank_spot_not) #down



 end

 def print_maze( maze )
 maze.each {|row|
 puts row.join('')
  }
 end


 maze = read_maze(filename)
 print_maze(maze)
 solve_maze(maze)
 print_maze(maze)

 puts "would you like to further drive yourself nuts with this maze solver"

 filename = gets.chomp.to_s
 maze = read_maze(filename)
 print_maze(maze)

 end

 puts "you have quit"

1 Ответ

1 голос
/ 04 декабря 2009

Вот несколько советов относительно вашего кода:

  • solve_maze принимает четыре параметра, но вы передаете только один в начальном вызове (solve_maze(maze))
  • Все ваши объекты - это либо строки, либо массивы строк, но вы постоянно выполняете с ними целочисленную математику
  • Вы постоянно используете self для ссылки на текущий объект, но у вас даже нет текущего объекта, поскольку вы пишете в процедурном стиле, а не объектно-ориентированном. [Примечание: я знаю, что в Ruby у вас всегда есть текущий объект, который в данном случае является анонимным объектом верхнего уровня.]

Вот еще несколько советов относительно вашего рабочего процесса:

  • Забудьте о цикле while. Зачем вам хотеть возможность решения нескольких лабиринтов, если вы не можете даже решить один в данный момент? Вы всегда можете добавить это позже.
  • Забудьте о чтении лабиринта из файла, просто жестко закодируйте его в строку. Вы всегда можете добавить это позже.
  • На самом деле, забудьте о синтаксическом анализе строки, просто жестко закодируйте лабиринт в структуре данных, с которой вам удобно иметь дело. Я бы предложил двумерный массив логических значений. Вы всегда можете ... ну, вы поняли.
  • Начните с простого лабиринта. Мол, действительно просто. Мол, одна плитка, где вы уже запускаете в пункте назначения. Затем перейдите к лабиринту с двумя плитками, где пункт назначения находится рядом с началом.

Примеры:

solvable = [
  [false, false, false, false, false, false, false, false, false, false],
  [false,  true,  true,  true,  true,  true,  true,  true,  true, false],
  [false, false, false, false, false, false,  true,  true,  true, false],
  [false,  true,  true,  true,  true,  true,  true,  true,  true, false],
  [false, false, false, false, false, false, false, false, false, false]
]

unsolvable = [
  [false, false, false, false, false, false, false, false, false, false],
  [false,  true,  true,  true,  true,  true,  true,  true,  true, false],
  [false, false, false, false, false, false, false, false, false, false],
  [false,  true,  true,  true,  true,  true,  true,  true,  true, false],
  [false, false, false, false, false, false, false, false, false, false]
]

start  = [1, 1]
finish = [3, 1]

Таким образом, вы можете просто использовать if, чтобы проверить, свободен ли путь или нет, поскольку пустые плитки true и стены false

Вот хитрый трюк: в Ruby все, что не является ни false, ни nil, является правдой. Это означает, что вы можете поместить туда все, что вы хотите (кроме false или nil, конечно) вместо true, и уловка if будет работать. Например, вы можете закодировать информацию о расстоянии, которая нужна алгоритму, непосредственно в самом лабиринте. Просто вставьте туда действительно большое число вместо true и 0 в финиш:

infin = 1.0/0.0

solvable = [
  [false, false, false, false, false, false, false, false, false, false],
  [false, infin, infin, infin, infin, infin, infin, infin, infin, false],
  [false, false, false, false, false, false, infin, infin, infin, false],
  [false,   0  , infin, infin, infin, infin, infin, infin, infin, false],
  [false, false, false, false, false, false, false, false, false, false]
]

unsolvable = [
  [false, false, false, false, false, false, false, false, false, false],
  [false, infin, infin, infin, infin, infin, infin, infin, infin, false],
  [false, false, false, false, false, false, false, false, false, false],
  [false,   0  , infin, infin, infin, infin, infin, infin, infin, false],
  [false, false, false, false, false, false, false, false, false, false]
]

start  = [1, 1]
finish = [3, 1]

Однако начните с простого:

maze   = [[0]]
start  = [0, 0]
finish = [0, 0]

maze   = [[0, infin]]
start  = [0, 1]
finish = [0, 0]

maze = [
  [false, false, false],
  [false, infin, false],
  [false,   0  , false],
  [false, false, false]
]
start  = [1, 1]
finish = [2, 1]

maze = [
  [false, false, false],
  [false, infin, false],
  [false, infin, false],
  [false,   0  , false],
  [false, false, false]
]
start  = [1, 1]
finish = [3, 1]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...