main
 1require "spec_helper"
 2
 3def print_maze(maze)
 4  puts "\e[H\e[2J"
 5  p " ||A||B||C||D||E||F||G||H||"
 6  8.times do |n|
 7    result = "#{n+1}|"
 8    maze.each do |column|
 9      result += "|#{column[n]}|"
10    end
11    p result + "|"
12  end
13end
14
15def explore_maze(maze, x, y)
16  print_maze(maze)
17  return false if y > 7 || y < 0 || x < 0 || x > 7
18  return false if maze[x][y] == "*" || maze[x][y] == "X"
19  return true if maze[x][y] == "E"
20  maze[x][y] = "X"
21  return true if explore_maze(maze, x, y-1) # up
22  return true if explore_maze(maze, x+1, y) # right
23  return true if explore_maze(maze, x, y+1) # down
24  return true if explore_maze(maze, x-1, y) # left
25  return false
26end
27
28def is_maze_solveable(maze)
29  start_x = start_y = nil
30  8.times do |x|
31    8.times do |y|
32      if maze[x][y] == 'S'
33        start_x = x
34        start_y = y
35      end
36    end
37  end
38  return false unless start_x
39  explore_maze(maze, start_x, start_y)
40end
41
42describe "maze" do
43  it "is solvable" do
44    maze = Array.new(8) { Array.new(8) { " " } }
45    8.times { |n| maze[n][0] = "*" if (0...5).include?(n) } # row 1
46    maze[0][1] = maze[4][1] = "*" # row 2
47    maze[0][2] = maze[2][2] = maze[3][2] = maze[4][2] = "*" # row 3
48    maze[0][3] = maze[4][3] = maze[5][3] = maze[6][3] = maze[7][3] = "*" # row 4
49    maze[0][4] = maze[2][4] = maze[7][4] = "*" # row 5
50    maze[0][5] = maze[4][5] = maze[7][5] = "*" # row 6
51    maze[0][6] = maze[1][6] = maze[2][6] = maze[3][6] = maze[4][6] = maze[7][6] = "*" # row 7
52    maze[4][7] = maze[5][7] = maze[6][7] = maze[7][7] = "*" # row 8
53
54    maze[1][2] = "S"
55    maze[6][6] = "E"
56    print_maze(maze)
57
58    expect(is_maze_solveable(maze)).to be_truthy
59  end
60end