Guest User

Maze solver

a guest
Jun 3rd, 2014
336
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Ruby 2.06 KB | None | 0 0
  1. class Coord
  2.     def initialize(x, y)
  3.         @x = x
  4.         @y = y
  5.     end
  6.    
  7.     def equals(other)
  8.         return @x == other.x && @y == other.y
  9.     end
  10.    
  11.     def x
  12.         return @x
  13.     end
  14.    
  15.     def y
  16.         return @y
  17.     end
  18. end
  19.  
  20. class Cell
  21.     def initialize(pos, prev, solid)
  22.         @pos = pos
  23.         @prev = prev
  24.         @solid = solid
  25.         @visited = false
  26.         @path = false
  27.     end
  28.    
  29.     def pos
  30.         return @pos
  31.     end
  32.    
  33.     def prev
  34.         return @prev
  35.     end
  36.    
  37.     def setPrev(newPos)
  38.         @prev = newPos
  39.     end
  40.    
  41.     def solid
  42.         return @solid
  43.     end
  44.    
  45.     def visited
  46.         return @visited
  47.     end
  48.    
  49.     def visit
  50.         @visited = true
  51.     end
  52.    
  53.     def addToPath
  54.         @path = true
  55.     end
  56.    
  57.     def path
  58.         return @path
  59.     end
  60.    
  61.     def to_c
  62.         if solid
  63.             return "#"
  64.         elsif path
  65.             return "*"
  66.         else
  67.             return " "
  68.         end
  69.     end
  70. end
  71.  
  72. var = gets.split(" ")
  73. width = var[0].to_i-1
  74. height = var[1].to_i-1
  75.  
  76. maze = Array.new
  77. for x in 0..width
  78.     maze[x] = Array.new
  79. end
  80. for y in 0..height
  81.     s = gets
  82.     for x in 0..width
  83.         pos = Coord.new(x, y)
  84.         case s[x]
  85.         when "#"
  86.             maze[x][y] = Cell.new(pos, nil, true)
  87.         when "S"
  88.             start = pos
  89.             maze[x][y] = Cell.new(pos, nil, false)
  90.         when "E"
  91.             stop = pos
  92.             maze[x][y] = Cell.new(pos, nil, false)
  93.         else
  94.             maze[x][y] = Cell.new(pos, nil, false)
  95.         end
  96.     end
  97. end
  98.  
  99. front = Array.new
  100. front.push(maze[start.x][start.y])
  101.  
  102. while true
  103.     if front.length == 0
  104.         puts "No path found!"
  105.         exit 1
  106.     end
  107.     point = front.pop
  108.    
  109.     if point.pos.equals(stop)
  110.         break
  111.     end
  112.    
  113.     for x in -1..1
  114.         for y in -1..1
  115.             if x == 0 or y == 0
  116.                 pX = point.pos.x+x
  117.                 pY = point.pos.y+y
  118.                 if pX < 0 or pY < 0 or pX > width or pY > height
  119.                     next
  120.                 end
  121.                 p = maze[pX][pY]
  122.                 if !p.visited && !p.solid
  123.                     p.visit
  124.                     p.setPrev(point.pos)
  125.                     front.push(p)
  126.                 end
  127.             end
  128.         end
  129.     end
  130. end
  131.  
  132. while !point.pos.equals(start)
  133.     point.addToPath
  134.     prev = point.prev
  135.     point = maze[prev.x][prev.y]
  136. end
  137.  
  138. for y in 0..height
  139.     for x in 0..width
  140.         point = maze[x][y]
  141.         if point.pos.equals(start)
  142.             print "S"
  143.         elsif point.pos.equals(stop)
  144.             print "E"
  145.         else
  146.             print point.to_c
  147.         end
  148.     end
  149.     puts ""
  150. end
Advertisement
Add Comment
Please, Sign In to add comment