2009-12-04 51 views
1

好吧,所以我不得不为这个破解一个喜力。试图用文本文件解决最短路径问题。寻路条件def

我的研究带我去: link text link text 相当不错的信息,我的算法

基本上,我想在“S”为起点,开始了和“F”戒烟完成或回报无解的消息

两个样式自我测试或文本文件被认为

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

     and non-solvable 

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

我的问题是我有特鲁为此写了一个路径查找def并将其返回到自定义打印def。下面是整个织物的代码。以及我的第一次尝试。空间可以自由成为一条道路。墙被定义为任何其他键,但空格键。同时也要警告我的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

这里有几个关于你的代码的提示:

  • 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中,所有不是falsenil都是正确的。这意味着,你可以把你想要的一切(当然除了falsenil),而不是trueif技巧将仍然工作。例如,您可以直接在迷宫中编码算法需要的距离信息。只要把一些真的大数目,而不是在那里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]