summaryrefslogtreecommitdiff
path: root/spec/practice/recursive_maze_spec.rb
blob: ff0aa184dc021fcec0b715b698a946bafc63df18 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
require "spec_helper"

def print_maze(maze)
  puts "\e[H\e[2J"
  p " ||A||B||C||D||E||F||G||H||"
  8.times do |n|
    result = "#{n+1}|"
    maze.each do |column|
      result += "|#{column[n]}|"
    end
    p result + "|"
  end
end

def explore_maze(maze, x, y)
  print_maze(maze)
  return false if y > 7 || y < 0 || x < 0 || x > 7
  return false if maze[x][y] == "*" || maze[x][y] == "X"
  return true if maze[x][y] == "E"
  maze[x][y] = "X"
  return true if explore_maze(maze, x, y-1) # up
  return true if explore_maze(maze, x+1, y) # right
  return true if explore_maze(maze, x, y+1) # down
  return true if explore_maze(maze, x-1, y) # left
  return false
end

def is_maze_solveable(maze)
  start_x = start_y = nil
  8.times do |x|
    8.times do |y|
      if maze[x][y] == 'S'
        start_x = x
        start_y = y
      end
    end
  end
  return false unless start_x
  explore_maze(maze, start_x, start_y)
end

describe "maze" do
  it "is solvable" do
    maze = Array.new(8) { Array.new(8) { " " } }
    8.times { |n| maze[n][0] = "*" if (0...5).include?(n) } # row 1
    maze[0][1] = maze[4][1] = "*" # row 2
    maze[0][2] = maze[2][2] = maze[3][2] = maze[4][2] = "*" # row 3
    maze[0][3] = maze[4][3] = maze[5][3] = maze[6][3] = maze[7][3] = "*" # row 4
    maze[0][4] = maze[2][4] = maze[7][4] = "*" # row 5
    maze[0][5] = maze[4][5] = maze[7][5] = "*" # row 6
    maze[0][6] = maze[1][6] = maze[2][6] = maze[3][6] = maze[4][6] = maze[7][6] = "*" # row 7
    maze[4][7] = maze[5][7] = maze[6][7] = maze[7][7] = "*" # row 8

    maze[1][2] = "S"
    maze[6][6] = "E"
    print_maze(maze)

    expect(is_maze_solveable(maze)).to be_truthy
  end
end