Amazingly Raku

Part 2: The Path

by Arne Sommer

Amazingly Raku - Part 2: The Path

[94.2] Published 28. September 2020.

See also: The Introduction | Part 1: The Maze.

In this part we will look for a path through the maze, if any, using the Shortest Path Algorithm. Or rather, one of them. I have chosen Breadth-first Search. (The A* algorithm may also be worth a look.)

The output should look like this:

$ ./maze-solver-spa 5x5-ok.txt
Path: SEESEESS (with length 8)

$ ./maze-solver-spa 5x5-fail.txt
No path

Note that there can be several paths, with equal length, and which one you get from a program depends on the algorithm and the small choices (implementation details). I will show the length (number of steps), so that you can compare the result with your own program - if you choose to have a go at it.

Shadowboxing

I'll start with a program doing a single spart of the task, looking at the exits from a given position. The point is that it does not suffice that the cell in question has an exit in a given direction, the neighbouring cell in that direction must have a corresponding exit in that direction as well.

File: maze-inspector (partial)
#! /usr/bin/env raku

unit sub MAIN ($maze where $maze.IO.e && $maze.IO.r);

constant $end = '█';

my @maze = $maze.IO.lines>>.comb>>.list;   # [1]

my $rows  = @maze.elems;                   # [2]
my $cols  = @maze[0].elems;                # [2a]

die "Missing entrypoint '█' in maze" unless @maze[0][0] eq $end;
die "Missing exit point '█' in maze" unless @maze[$rows-1][$cols-1] eq $end;
                                           # [3]
my %desc2symbol = (                        # [4]
   SW   => '╗',
   EW   => '═',
   NW   => '╝',
   ES   => '╔',
   NS   => '║',
   NE   => '╚',
   ESW  => '╦',
   NES  => '╠',
   NSW  => '╣',
   NEW  => '╩',
   NESW => '╬'
);

my %symbol2desc = %desc2symbol.antipairs;            # [5]

%symbol2desc{'█'} = 'WNES';                          # [6]
%symbol2desc{' '} = '';                              # [7]

for ^$rows -> $row                                   # [8]
{
  for ^$cols -> $col                                 # [8a]
  {
    say ": [$row, $col]: { @maze[$row][$col] } -> \  # [9]
      { %desc2symbol{get_directions($row, $col)} // '#' } \
      ({ get_directions($row, $col) })";
  }
  say "";
}

[1] This beautifully simple line reads in the entire maze from the file, splitting each line into single characters (with comb), giving a two-dimentional array. Note that comb gives a Sequence, a lazy data structure, suited for one-time consumption (in e.g. a loop). That does not work out as we are goingto access the values repeatedly, and not in sequence. Slapping on a list on each row (with >>.list) turns the rows into lists, thus solving the problem.

[2] The number of rows, and columns [2a], taken from the first row. We assume that all the rows have the same length.

[3] Abort if the maze doesn not have the entry and exit.

[4] The symbols, with the directions the represent as keys.

[5] The opposite; from the symbols to the direction letters.

[6] The entry and exit has exits in all four directions, so that we don't have to special case them during the traversal.

[7] Empty cells have no exits.

[8] For each row and column [8a].

[9] Print the row and column number, the maze symbol at that location, and the legal exits from there. Legal, as in the neighbouring cell in that direction has an exit lined up towards us.

See docs.raku.org/routine/list for more information about list.

The // '#' in [9] is there as the exit unfortunately has to be special cased after all. We'll get back to why when we run the program.

File: maze-inspector (the rest)
sub has_direction ($row, $col, $direction)                      # [10]
{
  return False unless @maze[$row][$col].defined;                # [11]
  return %symbol2desc{@maze[$row][$col]}.contains: $direction;  # [12]
}

sub get_directions ($row, $col)                                 # [13]
{
  my @directions;                                               # [14]

  return '' unless %symbol2desc{@maze[$row][$col]};             # [15]

  for %symbol2desc{@maze[$row][$col]}.comb -> $direction        # [16]
  {
    @directions.push: 'N'
      if $direction eq 'N' && has_direction($row -1, $col, 'S');  # [17]

    @directions.push: 'S'
      if $direction eq 'S' && has_direction($row +1, $col, 'N');  # [18]

    @directions.push: 'W'
      if $direction eq 'W' && has_direction($row, $col -1, 'E');  # [19]

    @directions.push: 'E'
      if $direction eq 'E' && has_direction($row, $col +1, 'W');  # [20]
  }

  return @directions.join
    if @directions.elems > 1
      || ($row == 0 && $col == 0)
      || ($row == $rows - 1 && $col == $cols - 1);                # [21]

  return " ";                                                     # [22]
}

[10] This helper procedure tells us if the given cell has an exit in the specified direction.

[11] The cell is undefined if we are trying to access a cell outside the maze, i.e. we are off the edge.

[12] Does it have the exit? We use contains to search for the directional letter in the directional string; e.g. «N» in «NESW». We could have used a Regex, but this is faster.

[13] This is the big deal. We give it a cell (row and column), and it gives us a list of available exits. The cell must have the exit, but the neighbouring cells must have an exit lined up towards us as well.

[14] We rae storing the directional letters here.

[15] If the symbol at the current position isn't present in our list of symbols, it has no exits (as it is a space, or should be).

[16] Iterate over the directions from the current cell, using comb to split the string into a list of letters.

[17] It has an exit in the North direction if it has an exit in the North direction (silly, yes), and the cell to the North has en exit to the South.

[18] As above, but to the South.

[19] As above, but to the West.

[20] As above, but to the East.

[21] Return the directions (as a string, courtesy of join), if there are at least 2 directions. A single direction has no corresponding symbol, and is a dead end anyway (so we can ignore it). Unless we are at the entry or exit. They can actually have just a single direction (after the three others have been discarded). The example shown below shows why that is the case.

[22] Return a space if there are 0 or 1 directions, so that the program can print a space.

See docs.raku.org/routine/contains for more information about contains.

Running it on the «5x5-ok.txt» maze, shown below at the left. The result of applying «get_directions» on it is shown on the right:

█╩╩║╬     ╔
╠╬╬╔╦     ╠╦╗ 
╬╬╬═╣     ╠╬╬═╣
╠╩╩╩╣     ╠╩╩═╣
╩╬╬║█     ╚  #

The three cells marked as blue should really be blank, but the algorithm is not smart enough (=recursive), and allows them as the neighbouring cells have the corresponding exit. But it does not really matter. They represent dead ends, and will be discovered as such, albeit a little bit later on. The exit cell, marked with green, is discussed in [6] below.

$ ./maze-inspector 5x5-ok.txt 
: [0, 0]: █ -> ╔ (ES)     # [1]
: [0, 1]: ╩ -> ═ (EW)     # [2]
: [0, 2]: ╩ ->   ( )      # [3]
: [0, 3]: ║ ->   ( )      # [4]
: [0, 4]: ╬ ->   ( )      # [5]

: [1, 0]: ╠ -> ╠ (NES)
: [1, 1]: ╬ -> ╦ (ESW)
: [1, 2]: ╬ -> ╗ (SW)
: [1, 3]: ╔ ->   ( )
: [1, 4]: ╦ -> ╗ (SW)

: [2, 0]: ╬ -> ╠ (NES)
: [2, 1]: ╬ -> ╬ (NESW)
: [2, 2]: ╬ -> ╬ (NESW)
: [2, 3]: ═ -> ═ (EW)
: [2, 4]: ╣ -> ╣ (NSW)

: [3, 0]: ╠ -> ╠ (NES)
: [3, 1]: ╩ -> ╩ (NEW)
: [3, 2]: ╩ -> ╩ (NEW)
: [3, 3]: ╩ -> ═ (EW)
: [3, 4]: ╣ -> ╣ (NSW)

: [4, 0]: ╩ -> ╚ (NE)
: [4, 1]: ╬ -> ═ (EW)
: [4, 2]: ╬ ->   ( )
: [4, 3]: ║ ->   ( )
: [4, 4]: █ -> # (N)      # [6]

[1] The box symbol has four exits, but W and N are outside of the maze and are ignored.

[2] The N is outside the maze this time as well.

[3] The N is outside the maze this time as well. The E leads to a cell without a W exit, and is also ignored

[4] The N is outside the maze this time as well. The cell bellow does not have a N, so this one has no exits at all.

[5] The same as [4].

[6] This one is tricky, It is the exit, and it has one exit only; N. That is perfectly legal, for the entry and exit points only. We don't have a symbol with only one exit, so I used a # instead to show that it is a special case.

The Real Deal

Then we can go on to the program traversing the maze.

The first part is almost identical to the code in «maze-inspector», so is shown without explanation (except one):

File: maze-solver-spa-simple (partial)
#! /usr/bin/env raku

unit sub MAIN ($maze where $maze.IO.e && $maze.IO.r);

constant $end = '█';

my @maze = $maze.IO.lines>>.comb>>.list;

my $rows  = @maze.elems;
my $cols  = @maze[0].elems;

die "Missing entrypoint '█' in maze" unless @maze[0][0] eq $end;
die "Missing exit point '█' in maze" unless @maze[$rows-1][$cols-1] eq $end;

my %desc2symbol = (
   SW   => '╗',
   EW   => '═',
   NW   => '╝',
   ES   => '╔',
   NS   => '║',
   NE   => '╚',
   ESW  => '╦',
   NES  => '╠',
   NSW  => '╣',
   NEW  => '╩',
   NESW => '╬'
);

my %symbol2desc = %desc2symbol.antipairs;

%symbol2desc{'█'} = 'WNES';
%symbol2desc{' '} = '';

sub has_direction ($row, $col, $direction)
{
  return False unless @maze[$row][$col].defined;
  return %symbol2desc{@maze[$row][$col]}.contains: $direction;
}

sub get_directions ($row, $col)
{
  my @directions;

  return '' unless %symbol2desc{@maze[$row][$col]};

  for %symbol2desc{@maze[$row][$col]}.comb -> $direction
  {
    @directions.push: 'N'
      if $direction eq 'N' && has_direction($row -1, $col, 'S');

    @directions.push: 'S'
      if $direction eq 'S' && has_direction($row +1, $col, 'N');

    @directions.push: 'W'
      if $direction eq 'W' && has_direction($row, $col -1, 'E');

    @directions.push: 'E'
      if $direction eq 'E' && has_direction($row, $col +1, 'W');
  }

  return @directions.join;  # [0]           

  # return @directions.join
  #   if @directions.elems > 1
  #     || ($row == 0 && $col == 0)
  #     || ($row == $rows - 1 && $col == $cols - 1);
  # 
  # return " "; 
}

[0] We can actually get away with only this return statement, instead of the two below it. See if you can figure out why. And if we should hold on to them.

Then we come to the job of traversing the maze. We do this by looking for non-visited cells by following legal exits from the current position (initially the entry point), and adding those cells to a queue of positions to consider. Then we work through the queue until we arrive at the exit, or the queue is empty.

File: maze-solver-spa-simple (the rest)
my @visited;                                                # [1]

my @todo = ("0;0;");                                        # [2]
my $path;                                                   # [3]

while @todo                                                 # [4]
{
  my $current = @todo.shift;                                # [4a]

  my ($row, $col, $possible-path) = $current.split(';');    # [5]
  
  @visited[$row][$col] = True;                              # [6]

  if $row == $rows-1 && $col == $cols-1                     # [7]
  {
    $path = $possible-path;                                 # [7a]
    last;                                                   # [7b]
  }

  for get_directions($row, $col).comb -> $direction         # [8]
  {
    @todo.push: "{ $row -1 };{ $col };{ $possible-path }N"
      if $direction eq "N" and ! @visited[$row-1][$col]++;  # [8n]

    @todo.push: "{ $row +1 };{ $col };{ $possible-path }S"
      if $direction eq "S" and ! @visited[$row+1][$col]++;  # [8s]

    @todo.push: "{ $row };{ $col -1 };{ $possible-path }W"
      if $direction eq "W" and ! @visited[$row][$col-1]++;  # [8w]

    @todo.push: "{ $row };{ $col +1 };{ $possible-path }E"
      if $direction eq "E" and ! @visited[$row][$col+1]++;  # [8e]
  }
}

if $path                                                    # [9]
{
  say "Path: $path (with length { $path.chars })";          # [9a]
}
else
{
  say "No path";                                            # [9b]
}

[1] A two dementional list of visited cells, so that we can back off the second time we come across it. (As the first one is the shortest path there).

[2] We start at the start. The values in list are cells to consider. The value is composed of «row»;«column»;«path to get there». The path is there so that we simply can report it when (if) we arrive at the exit.

[3] We store the path here, if we reach the exit.

[4] As long as there are cells left to consider, get the first one [4a].

[5] Split it as discussed in [2].

[6] Indicate that we have visited this cell, so that we can back off later (as discussed in [1]).

[7] Have we arrived at the exit? If so, set the path [7a] and exit the loop [7b].

[8] Get the directions we can go from the current cell, as a string. (The maximum value is «NESW», ans the minimum is an empty string.)

[9] There are two ways to get there. One: If we run out of cells to consider. In that case we did not reach the exit, and the $path variable is not set. Two: We did find the exit, and $path variable has the path. Print the path, or the "No path" error message.

Running it:

$ ./maze-solver-spa-simple 50x25.txt 
Path: ESENEEESEEEESESWSSESSSEEENEEEEEEEEEESESE
  SEESESSSEEESSEESEEESEEESESSEESEEENEEEESSS (with length 81)

An Image is Worth a Thousand Directions

Just listing the directions, as we just did, is pretty arrogant. We are leaving it to the user to verify it by hand, or trust the program. We should really show the path through the maze, as I did (albeit manually) in part 1.

So we'll do just that (with a «--show» command line option), using the ANSI Control Sequences to set and unset the colours. See my Counting Water with Raku and Perl article for examples.

The ANSI codes do not work with HTML pages, but we can fix that by using Bootstrap colours instead (with the «--html» command line option), as done in the article I just linked to.

We can also add a coverage map, which is useful to visualize why a maze is untraversable. We'll show that one instead of the path, if the maze is untraversable. And we'll visualize the difference with colours; green for a traversable maze, and red for an untraversable one.

The maze solver program:

File: /maze-solver-spa (partial)
#! /usr/bin/env raku

unit sub MAIN ($maze where $maze.IO.e && $maze.IO.r,
               :v(:$verbose),                       # [1]  
               :s(:$show),                          # [2]
               :h(:$html));                         # [2a]

constant $end = '█';

my @maze = $maze.IO.lines>>.comb>>.Array;           # [3]

my $rows  = @maze.elems;
my $cols  = @maze[0].elems;

die "Missing entrypoint '█' in maze" unless @maze[0][0] eq $end;
die "Missing exit point '█' in maze" unless @maze[$rows-1][$cols-1] eq $end;

my %desc2symbol = (
   SW   => '╗',
   EW   => '═',
   NW   => '╝',
   ES   => '╔',
   NS   => '║',
   NE   => '╚',
   ESW  => '╦',
   NES  => '╠',
   NSW  => '╣',
   NEW  => '╩',
   NESW => '╬'
);

my %symbol2desc = %desc2symbol.antipairs;

%symbol2desc{'█'} = 'WNES';
%symbol2desc{' '} = '';

my $col-blue  = "\e[44m";                            # [4]
my $col-green = "\e[42m";
my $col-red   = "\e[101m";
my $col-stop  = "\e[0m";

if ($html)                                           # [5]
{
  $col-blue  = '<span class="text-primary">';
  $col-green = '<span class="text-success">';
  $col-red   = '<span class="text-danger">';
  $col-stop  = '</span>';
}

if $verbose                                          # [1]
{
  say ": Rows: $rows";                               # [1a]
  say ": Cols: $cols";                               # [1a]
  say ": Row: { @$_.join }" for @maze;               # [1b]
}

my @visited;                                         # [6]

my @todo = ("0;0;");                                 # [7]
my $path;                                            # [8]

while @todo                                          # [9]
{
  my $current = @todo.shift;                         # [10]

  say ": Checking: $current" if $verbose;

  my ($row, $col, $possible-path) = $current.split(';');     # [11]
  
  @visited[$row][$col] = True;                               # [12]

  if $row == $rows-1 && $col == $cols-1                      # [13]
  {
    $path = $possible-path;                                  # [13a]
    last;                                                    # [13b]
  }

  for get_directions($row, $col).comb -> $direction          # [14]
  {
    @todo.push: "{ $row -1 };{ $col };{ $possible-path }N"   # [14N]
      if $direction eq "N" and ! @visited[$row-1][$col]++;

    @todo.push: "{ $row +1 };{ $col };{ $possible-path }S"   # [14S]
      if $direction eq "S" and ! @visited[$row+1][$col]++;

    @todo.push: "{ $row };{ $col -1 };{ $possible-path }W"   # [14W]
      if $direction eq "W" and ! @visited[$row][$col-1]++;

    @todo.push: "{ $row };{ $col +1 };{ $possible-path }E"   # [14E]
      if $direction eq "E" and ! @visited[$row][$col+1]++;
  }
}

if $path                                                     # [15]
{
  say "Path: $path (with length { $path.chars })";           # [15a]
  show-path($path) if $show;                                 # [15b]
}
else
{
  say "No path";                                             # [15c]
  show-coverage if $show;                                    # [15d]
}

[1] Verbose mode will print the dimensions of the maze [1a], and the maze itself [1b]. Note the @$_syntax for accessing the individual elements in the first dimension of the array as arrays themselves.

[2] Use this command line option to show the maze with the path or coverage, using ANSI codes.

[3] use this in addition to [2] to get the output with HTML markup instead of ANSI codes.

[4] I have added blue as well, even if I haven't used it.

[5] If we want html ouput, I simply override the codes (markup) to use.

[6] We set the claue for cells we have visited, so that we can stop future tries. (The first one is the shortest path there.)

[7] A list of celles to consider. Initially, at the entrance [0,0]. The third part is the path so far, which is empty here.

[8] A global variable. If it contains anything when the loop terminates, we have a path from the entrance to the exit. The path is stored in the variable.

[9] While we have more cells to consider,

[10] Get the first one in the queue.

[11] Split into row, column and path to get there.

[12] Set the cell as visited. Note that we do this when we actually gets there, and not when we see the cell the first time. That is a problem, and the ++ thingies in [

[13] Have we reached the exit? If so save the path [13a] and exit the loop [13b].

[14] For all legal directions (i.e. the call has the direction, and the neighbouring cell in that direction has a matching exit) from the current cell, add them to the list if we have not visited them already

[15] Do we have a path? If so say so [15a] and print the maze with the path [15b]. If not, say so [15c] and print the coverage map [15d].

The following procedures should be familiar by now:

File: maze-solver-spa (partial)
sub has_direction ($row, $col, $direction)
{
  return False unless @maze[$row][$col].defined;
  return %symbol2desc{@maze[$row][$col]}.contains: $direction;
}

sub get_directions ($row, $col)
{
  my @directions;

  return '' unless %symbol2desc{@maze[$row][$col]};

  for %symbol2desc{@maze[$row][$col]}.comb -> $direction
  {
    @directions.push: 'N'
      if $direction eq 'N' && has_direction($row -1, $col, 'S');
  
    @directions.push: 'S'
      if $direction eq 'S' && has_direction($row +1, $col, 'N');

    @directions.push: 'W'
      if $direction eq 'W' && has_direction($row, $col -1, 'E');

    @directions.push: 'E'
      if $direction eq 'E' && has_direction($row, $col +1, 'W');
  }

  return @directions.join;

  # return @directions.join
  #   if @directions.elems > 1
  #     || ($row == 0 && $col == 0)
  #     || ($row == $rows - 1 && $col == $cols - 1);
  # 
  # return " "; 
}

And finally the two procedures showing the maze graphically:

File: maze-solver-spa (partial)
sub show-path ($path)
{
  my $row = 0;
  my $col = 0;

  for $path.comb -> $direction   # [1]
  {  
    @maze[$row][$col] = $col-green ~ @maze[$row][$col] ~ $col-stop;  # [1a]
    if    $direction eq "N" { $row--; }
    elsif $direction eq "S" { $row++; }
    elsif $direction eq "W" { $col--; }
    elsif $direction eq "E" { $col++; }
  }
  
  @maze[$row][$col] = $col-green ~ @maze[$row][$col] ~ $col-stop;   # [2]

  say @$_.join for @maze;
}

sub show-coverage
{
  my @matrix;             # [3]

  for ^$rows -> $row      # [4]
  {
    for ^$cols -> $col    # [4a]
    {
      @matrix[$row][$col] = @visited[$row][$col]
       ?? $col-red ~ @maze[$row][$col] ~ $col-stop
       !! @maze[$row][$col];
    }
  }

  say @$_.join for @matrix;
}

[1] Follow the path from the entry point, and highlight the cells [1a]. Note that this destroys the maze data structure by adding the colour markup, but that does not matter here as we are done after printng it.

[2] Highlight the exit as well.

[3] Here we do it differently. We start with an epty array,

[4] iterates over the rows [4] and columns [4a]

[5] marks the cell with red if we have visited it, and adds it without colour if not.

Running it:

$ ./maze-solver-spa 5x5-ok.txt 
Path: SEESEESS (with length 8)

$ ./maze-solver-spa -s 5x5-ok.txt 
Path: SEESEESS (with length 8)
╩╩║╬
╠╬╬╔╦
╬╬╬═╣
╠╩╩╩
╩╬╬║

Note the use of aliases; «-s» instead of «--show».

The entry and exit are colour coded here, as I have cheated and used html. The ANSI version does not work on that symbol, so it is shown with the normal colour in the terminal. Feel free to investigate...

Verbose mode can be used to show what is going on:

$ ./maze-solver-spa -v 5x5-ok.txt 
: Rows: 5
: Cols: 5
: Row: █╩╩║╬
: Row: ╠╬╬╔╦
: Row: ╬╬╬═╣
: Row: ╠╩╩╩╣
: Row: ╩╬╬║█
: Checking: 0;0;
: Checking: 0;1;E
: Checking: 1;0;S
: Checking: 0;2;EE
: Checking: 1;1;SE
: Checking: 2;0;SS
: Checking: 1;2;SEE
: Checking: 2;1;SES
: Checking: 3;0;SSS
: Checking: 2;2;SEES
: Checking: 3;1;SESS
: Checking: 4;0;SSSS
: Checking: 2;3;SEESE
: Checking: 3;2;SEESS
: Checking: 4;1;SSSSE
: Checking: 2;4;SEESEE
: Checking: 3;3;SEESSE
: Checking: 4;2;SSSSEE
: Checking: 1;4;SEESEEN
: Checking: 3;4;SEESEES
: Checking: 1;3;SEESEENW
: Checking: 4;4;SEESEESS
Path: SEESEESS (with length 8)

An untraversable maze will not be shown with a path. But we can show the coverage instead:

$ ./maze-solver-spa 5x5-fail.txt 
No path

$ ./maze-solver-spa -s 5x5-fail.txt 
No path


╦╬
╬╦
╦╣█

Verbose mode shows where the coverage, the red cells, come from. Note the path in the «Checking» lines, after the cell row and column:

$ ./maze-solver-spa -v 5x5-fail.txt 
: Rows: 5
: Cols: 5
: Row: █╠╠╠╦
: Row: ╬╦╬╬╩
: Row: ╠╩╣╦╬
: Row: ╬╠╝╬╦
: Row: ╣╣╦╣█
: Checking: 0;0;
: Checking: 1;0;S
: Checking: 1;1;SE
: Checking: 2;0;SS
: Checking: 1;2;SEE
: Checking: 2;1;SES
: Checking: 3;0;SSS
: Checking: 0;2;SEEN
: Checking: 1;3;SEEE
: Checking: 2;2;SEES
: Checking: 4;0;SSSS
: Checking: 0;3;SEEEN
: Checking: 1;4;SEEEE
: Checking: 3;2;SEESS
: Checking: 0;4;SEEENE
: Checking: 3;1;SEESSW
: Checking: 4;1;SEESSWS
No path

Some more mazes:

$ ./maze-solver-spa -s 10x10-fail.txt 
No path
═╩╦╗╠╦╬╩
╬╣╠╬╬╣╩╝╦
╦╬╦╠╚╦╠╦╬╬
╣╣╬╦╩╬╠╬╦╬
╠╠╦╬╠╣╔╗╦╬
╠╩╠╦╬╦╬╩╦╗
╦╣║╦╩╠╬╬╣╚
╩╦╠╬╬╦╩╔╩╦
╠╠╦╩╬╦╩╩╬╗
╬╣╦╩╣╬╦╠╣█
$ ./maze-solver-spa -s 10x10-ok.txt 
Path: ESEEESESSEEESWSESSSE (with length 20)
█╣╠╠═╣╣╣╠╦
╗╬╦╩╬╝╠╣╦╦
╣╬╠╬╠╬╠╠╠╣
╬╣╣╗╩╣╦╣╬
╬╔╦╦╬╩╬╩╦╦
╦║╬╣╦╬╗╦╩║
╦╗╩╬╬╩╦╩╣╩
╣╠╩╠╬║╗╦╩
╬╠╠╩╬╬╩╗╠
╣╠╩║╦╬═╬╠█
$ ./maze-solver-spa -s 25x25-ok.txt 
Path: SSSSEENNEEEESEEESEEEEESSSESSEESEEEEESSSESSSSSSSSSESS
  (with length 52)
╩╣╦╬╔╣╠╬╦╣╣╬╠╦╦╦╬╩╣╩╬╦╩╩
╬╝╔╣╦╩╬╩╠╠╬╦╬╬╬╣╠╩╦╩╠╩╠╠
╠╦╦╦╦╩╠╬╝╠╠╣╣╣╦╩╣═╬╩╠╣╠
║╣╬╩╦╬╬╩╠╬╬╦╠╣╩╬╠╬╠╠╦╣
╩╩╬╚╠╩╠╣╣╠╬╦╩╦╬╬╩═╦╠╩╚╔╚╬
╦╔╦╬╩╩╠╔╣╩╦╝╣╩╬╠╠╝╦═╣╚╠╦
╝╩╣╩╦╩╣╣╦╦╣╠╦╔╦╦╬╬╬╬╣╩╣╠
╬╩╩╦╬╬╣╣╦═╩╠╣╬╠╣╠║╚╠╩╬╬╩╩
╩║║╚╬╩╦╬╝╣╣╩║╦╩╔╚╬╦╦╦╦╚║
╠╦╣╬╬╩╣╩╩╬║╠╣╠╩╠╬╬╣╬╠╦═╦╬
═╠╣╠╣╝╬╩╩╣╦╩╬╬╬╬╣╚╦╦╦╩╦╦╦
╬╠║╚╬╩╚╣╬╩╠╬╦╬╬╠╬╩╩╩╩╩╣═
╠╦╝╣╬╦╣╦╩╩╦╣╦╬╬╬═╦╠╦╣╩╩╠
╦╣╬╬╠╠╦╠╠╠╠╠╠╚╠╦╠╬╬╬╣╩╚╣╬
╦╣╔╚╣╩╬╦═╔╬╩╦╔╣╩╬╩╬╠╠╣╦╦
╣╠╦╠╩╬╦╠╠╬╠╬╩╦╣║╦╣═╦╩╬╠╬
╬╩╦╠╝╣╦╠╬╠╩═╬╩╦╣╩╣╠╩╠╬╬╠
╦╠╣╦╦╠╣╣═╠╩╣╬╬╬╦╩╠╣╬╣╝╩╦
╠╩╬╬═╔╩╦╠╠║╩╬╬╣╠╩╠╠╣╣╬╣╩
╩╦╬╣╬╣╠╬╣╠╣╩╦╣╦╬╣╚╦╣╠╠╩╚
╦╩╩╦╔╬═╣╦╝╣╣╠╠╬╦═╩╔╣╔╦╬╣
╩╬╩╬╣╩╠╩╠╣╬╠╦╠╬╠╬╬╬╠╦╠╠╩
╬╬╣╣╦╠╣╦╦╠╣╩╣╩╦╩╦╬╬╦╬╚╣╬╦
╚╬╣╦╠╠╠╩╝╩╬╚╠╠╬╣╬╦╣╩╠╣╩╬
╠║╬╦╣╬╦╠╠╦╣╠╣╩╚╠╦╩╩╠╬╚╬╣
./maze-solver-spa -s 50x25.txt
Path: ESENEEESEEEESESWSSESSSEEENEEEEEEEEEESESESEESESSSEEESSE
  ESEEESEEESESSEESEEENEEEESSS (with length 81)
█╣╠╬═╣═╩╣╠╠╝╩╬╩╠╣╦╬╩╚╠╦╣╠╣╠╦╬╩╠╩║╬╣╠╚╩╬╠╩╩═╬╣═╬╣╣║
╩╠╩║╦╩╦╦╦╣╝═╠╦═╦╚╬╩╬╠╩╬╣╩║╠╚╠╩═╦╣╦╩╠╠╬╬╬╣╠╩╩╣╦╣╣╦╣
╬╠╣═╚╣╬╩╩╠╦╩╩╦╣╩╝╬╣╩╩║╬║╠╣╬╩╣╝╬╦╣╬╩╦╠╠╬╦╣╦╣╣╩╠╬║╦╬
║╩╩╩═╣╬╠╠╦╩╬╠╝╩╬╦╩╣╣╩╦═╣╦╬╬╦╬╩╦╠╬╣╣╬╬╠╠╩╦╠╚╩╣╩╦╩╣╦
╩╬╣╣╣╣╦╩╦╩╝╩╦╣╦║╦╦╣╠╔╬╬╩╠╣╣╦═╬╠╠╣╦═╬╦╦╩║╠╩╩╠╩╬╦╩╬
╣╠╩╣╦╦╦╣╦╩╬═╩╠╠╦╠║╬╠╠╬╣╩╠╝╣╬╠╦╣║╬╚╩╬╬╬╦╠╦╦╠╬╠╣╦╣╩╠
╦╦║╩╩╠╣╣╩═╦╠╣╦╦╦╩╔╠╠╠╦╣╬═╬╬╠╦╩╩╬╬╦║╦╠║╦╬╣╦╦╬╠╩╩╠╬
╩╠╚╣╦╠╣╦╬╩╣╣╔╦╩╬╦╩╬╬╩╬╦╠╠╣╬═╦╦╦╦╬╦╣╠╣╠╔╩╬╣╠╦╝╬╦╣╬
╔╝╦╠╩╣╦╦╩╣╠╬╩╩╦╦╠╩╣╩╣╩╠╠╣╩╣╦╦╠╬╬╦╬╬╩╦╣╦╩╠╔╦╦╣╔╩╠╬╠
═╦╦╣╦╠║╬╦╣╦╬╣╬╩╣╦╦╣╠╬╬╩═╠╣╠╠╣╠╬╬╬╠╩╩╦╦╚╣╔╠╠╣╣╣╠╬╩╦
╬╬╣╣╩═╔╣╬╔╬╬╣╠╠╬╣╬╣╩╠╬╩╣╔╩╩╦╩╣╩║╩╔╩╦╣═╬║╦╠╣╝╦╦╠╬╩╚
╬╦╬╣╣╣╩╠╠╦╚╣╠╬╦║╣╩╦╬╣╦╠╦╠╠╣╠╣╣╣╠╣╣╬╣╩╣╠╠╠╩╣╣╩╦═╠╦╦
╣╩╩╬╩╬╦╚╠╩╣╬╬══╬╣╦╣╣╠╬╔╣╦╦╣╬╬╠╣╬║╦╠╣║╬╦╩╬╩╦╩╦╝╩╬╝
╦╩╣╣╦╦╬╩╩╝╬╠╩╣╠╬═╩╦╩╬╬╬╩═╩╠╣╩╠╣╦╠╣╣║╣═╦╩╣╝╬╣╦╬╦║╬
╬╠╦╩╠╬╠╦╚╩╠╬╠╩╣╦╝╬╦╠╦╩╠╦╬╬╣╠╠╩╬╦╣╣╣╔╬╩╠╠╣╦╠╠╬╣╦╩╦╣
╠╬╩╠╩╦╬╠╦╦╚╬╣╩╣╠╠╠╠╔═╩╬╩╬╩╠╠╣╣╬╔╠╬╠╬╣╩╦╩╣╣╩╩╦╦╦╬╬
╣╩╣╦╬╦╬╩╦╦╦╩╔═╩╦╦╬╣╣╩╩╣╣╦╦╦╦╩╠╩╩╦╦╩╣╦╩╩═╬╩╠╝╩╔╬╬╠╠
╦╠╝╠╔╬╝╬╦╣╝╦╬╦╝╬╦╣╩╬╣╬╠╦╣╣╣╦╬╣╬╬╩╠╦╦╣╬╩╬╦╣╣╣╬╠╦╦╝║
╠═╬╚╦╣╩╦╣╠╚╚╠║╦╩║╦╠╠═╣╣╠╬╩╦╔╠╠╬╩║╬╠╦╬═╦╦╦╦╩╠╩╩╦╦╬╣
╬╣╝╩═╠╣╩╦╣╬╠╦╝╠╦╣╬╬╣╣╬╦╠╦╦╝╬╦║╣╠╩╣╣╠╠╠╦╩╦╦╠╬╔╣╩╠╠╠
╣╦╣╩╬╩╬╣╬╠╬╬╣╣╠╦║╠╦═╦╣╠╩╬╦╝╠╠╝╚╠╠╩╣╩╩╬╠╦═╣╦╣╚╩╩╠╬
╠╩╠╩╣╣╬╠╝╠╣╠═╣║╦╬╩╣╩╣╩╣╣╬╣╩╠╦╣╩║╬╣╩╠╩╦╬╦╚╩╦╬╠╠╦╬╩╣
╠╠╠╦╣╠╠╬╦╩═╣╩╩╩╩╬║╬╣╔═╣╠╠╣╣╠╩═╠╩╦╩╩╬╩╩╠╣╦╬╬╦╦╣╩╣║
╠║╣╣╬╣╬╩╣╝╣╦╦╦╩╠╦╔╠╩═╚╬═╣╩╩╬╠╣╦╦╣║╦╦╠╣╩╦╣╣╣╝╝║╣╦╣
╩╬╠╩╬╬═╣╩╦╦╩╬╩╩╩╩╬╩╣╩╦╣╦╦╝╩╣║╠╦╦╬╦╦╠╬║╩╬╬╠╩╬╬╠║╠═

I generated 10 50x50 mazes with «mazemaker2», without those spurious exits. (They are included in the zip file.) Only 3 of them are traversable:

$ ./maze-solver-spa -s 50x50-01.txt 
No path
╔╗  
╠╠╣═╗╚║
 
 
╦╦╣

╠╗
 



╝╣

╠╔
╠╣
╔╩
╠╩
 ╦╬╝
╚╗╬╠ 
╠╗╦╗╩╬╝╣
╣╩╚╬╣
╩╗
 ╦
╔╣
╚╦



╚╦╣
╣╩╩╩
╩╩╩
╩╣╦
║╩

╔╔═
╚╝
╚╬╠║╣
╚╠╩╠╣
 ╬╗╔╣╣
╔╔╣╩╬╗
 ╔╣╬╗
═╦╔║╝
╠╩╠╗
╬╠╩║
╩═╚╚╩  ═╩ ╝═╝█
$ ./maze-solver-spa -s 50x50-02.txt 
No path
╔╦═╦═╦╔ ╦╦╔╔╦╗╗═╦╦╦═╦ ═╔╔╦═╔╔═╦╗╗═╦╦╦╗╔╔═╦╦═ ═╔╗
╠╣╣╣╠╣╣═╠╬╣║╩╩╣╦╩╩╦╩╬╗╬╠╦╩╦╠╔╬╦╦╦╝╬╣╬╬╬╠╦╩╦╣╣╬╔╠╣
╔╠╣╔╦╦╠╠╦╠╩╠╬╦╦╩╦╚╣╠╣║╣╩╩╠╬╣╗╩╦╚╣╬╦╩╬╣╣╠╣╣╝╩╩╩╠╣║║
╠╩╬╬╩╠╗╣╠╬╦╦╩╩╠║╣╦╬╚╦╗╩╠╬╠╔╬╩╣╦╩╠╦╣╠╦╩╠║╦╗╠╠╦╬═╬╠╝
╠╦╬╬╩╣╠╬╠══╬╬╣╦╦╚╠═╬╠╩╠╣╬╣╩╚╬╬╠╬╦╦╣╣╦╩╠╠╦╩╩╣╠╣╬╩╩╣
╠╣╩═╠╩╩╬╦╩╣╣╠╣╔╠═╦╬╩═╬╠╦╝╬╩╩╬╦╦╣╠╩╦╬╝╩╦╣╩╣╦╬╬╩╩╬╦╗
╔╠╣╬╠╠╩╦╦╠║╬╦╠╝╗╠╚╩╠╣╦╠╣╩╣╩╣╠╣╝╗╚╗╩╠╩╠╦╬╬╣╠╬╬╚╬╠╣╝
║╩╩╣╩╩╦╬╣╬╠╦╣╦╬╦╩╬╠╠╠╦╩╠╩╣╠╣╩╠╩╦╬╩╦╬╣╬╦╦╬╣╩╩╩╦╝╠╠╝
║╦╣╗╦╦╬╦╣╠╩╣╠╩╬╩╠╩╣╠╠╬╠╠╠╣╣╬╬╦╗╩╣╗╬╠╦║╣║╦╬╬╣╬╠╬╦║╗
╔╠╠║╣╦╦╦╦╠╣╠╬╔╝╬╦╦╦═╬╩╦╣╣╠╚╦╔╠╠╦╣╩╬╦╦╬╔╣╠╬╩╠╠╠╠╬╦║
║╣╦╠╠╩╣╩╦═╦╗╣╬╩╩╩╠╩╦╬╚╩╦╬╠╩╬╩╦╦╬╝╠╩╦║╣╬╠╩╩╚╠═╩╠╣╩╗
 ╬╔╦╦╩╣╣╬╬╬╣╠╦╠╔║╦╦╠╝╠╬╠╠╩╣╩╠╔╦╣╬╠╩╬╦╣╠╦╣═╬╣╚╩╗╣╣║
║╦╩╩╬╦╩╩╠╣╝╗╦═╝╦║╩╬╠╩╦╗╠╣╩╩╬╣╬╦╣╬╠╣╣╣╣╩╦╩╦╩╠╣╣╝╩╦╝
╠╠╠╦╣╠╦╦╩╦╩╦╗╩╠╩╩╦╔╩╦╦╬╠╦╦╩╦╚╣╬╩╩║╠╩╠╦╬╩╗╣╠╣╦╬╦╦╩║
╠╣╩╠╔╦╬╬╠╬╣╣╠╬╣╣╬╬╬╬╠╦╠╠╩═╣╦╦╠╠╬╠╦═╦═╩╬╬╠╦╬╠╩╠║╬╣╝
║╦╠╠╣╠╬╠╦╠╣╠╦╣╬╬║╠╩╩╦╦╦╣╩╠╩╩╠║╬╠╦║═╦╣╩╝╦╩╠╩╠╣╦╦╩╬╝
 ╩╬╩╬╦╦╬╠╣═╠╦╣╩╦╠╣╠╠╦╬╩╣╬═╬╬╬╬╚╬╣╦╦╦╬╣╬╬╣╝╣╝╩╠╗╦╩║
╠╩╬╣═╦╦╦╦╬╝╦╬╠╬╔╠╩╩╚╩╠╬╬╦╩╠╣╗║╗╬╦╗╔╩╚╦╩╣╬╦╩╠╠╣╣╠╣╣
║╗╩╬╣╣╠╣╩╠╣╣╬╬╣╩╠╦╠╣╩╣╗╩╗╬╣╦╗╬╩╔╠╦╦╩╬╩╩╬╬╬╠╠╠╬╔╔╩║
║╠╠╬╣╣╩╬╔╣╩╣╠╦╬╠╩╠╣╩╬╩╦╬╔╩╠╩╝║╝║╩╠╩╬╣╬╔╝╣╬╩╣╣╠╠╣╠╣
╔╣╬╣╩╬╬╝╩╗╣╩╬╠╩╩╦╠╦╦╠╦╦╠╣╩╩╬║╠╚╝╩╔╠╦╠╩╣╚╠╦═╩╠╠╠╠╣╗
 ╩╣╬╚╔╣╠╩║╠╚╦╬╚╩╬╬╝╗╬╦╣╣╬═╦╬╠══╝╠╚═╠╠╝╦╣╦╬╣╩╗╬╦╠╣║
╠╦═╣╩═╠║╠╬╚╣╠╬╠╣╣╠║╦╩╣╩═╦╣╬╠╦╩╩╚╬╠║╠╔╬╬╩╩╩╦╬╬╩╦║╩╣
╠╬╬╣╦╬═╩╠╔║╠╩╦╬║╩═║╬╬╣╬╬╠╣╦╔╠╩╦╬╩╠╬╩╩╠╬╚╬╬╬╠╗╦╬╬╬║
╠╠╠╣╦╬╝╦╗╦╬╦╩╩╩╔╬╬╩╩╩╦╩╠╦╠╣╦╦╦╬╣╬╬╦╣╩╣╦╦╠╦╠╩╬╦╠╩╬╣
╚╦╣╝╩╦╬╠╠╦╬╔╦╩╣╦╬╬╣╔╚╩╦╣╣╩╦╣╦╠╦╩╬╩╬╩╚╠╦╩╬╩╠╩╠╠╚╦╠╣
╚═╦╬╣╬╦╩╣╣╦╝╩╬╩╚╦╦╣╦╩╣╬╣╬╠╬╬╩║║╦╩╦╣═╣╣╩╠╦╣╩╩╦╠╬╬╦╝
╚╦╠╠╩╣╬╦╦╗╬╦╦╣╦╦╦╣╬╬╩╣╬╦╠╩╣╚╠╣╗║╣╩╠╬╩╔╣╬╚╦╣╬╩╩╬╔╬╣
╔╦╩╦╦╬╣╝╩╣╣╠╩╠╠╦╗╬═╠╣╗╬╣╩╬╣║╣╬╣╠╦╦║║╠╬║╬╠╠╬╠╣╬╠╣═╝
╠╠╦╣╩╬╬╠╦╠╦╣║╠╠╣╣╦╬╚╠╩╦╠╦╠╠╣╠╗╦╠╝╠╬╠╗╦╦╠╠╠╦╬╦╩╔╣╝ 
╠╩╣╔╠╩╬╠╔╣╦╣╣╠╝╣╬║╣╬╣╣╠║║╦╣╠╔╣╩╠╬╚╩╠╗╦╠╩╣╩╣╩╣╦╠╣╣║
║╩╠╣╬╠╦╔╩╬╦╬╩╣╗╦╬╣╣╣╩╣╩╣╦╦╠╬╬╩╦╠╦╠═║╦╣╬╬╦╬╩╩╩╔║╣╦ 
║╩╬╦║╣╚╩╬╦╠╠╩╚╦╗╦╣╣╩╬╩╣╩╝╩╩╔╬╬╩╠╩╬╠╗╦╦╠╠╣═║╬╦╦╣╠╩╗
╔╩╬╩╩╣╬╠╬╩║╦╝╦╩╩╣╣╗╦╬╦╬╠╦╩╬╠╣╝╩╬╔╬╩║╦╬╣╩╔╩╬╣╣╣║╠╣╗
╚╠╣═╠╠╣╠╠═╠╚╣╬╗╬╦╦╝╣╩╦╣╩╚╬╣╦╩╩╣╦╦╣╣╚╬╬╠╦╠╦╦╦╩╠╝╔╬╣
 ╠╠╣╩╦╣╗╬╦╬╩╬╬╬╣╣╩╠╦╦║╝╣╦╠╠╣╠╠╩╣╬╬╩╣╠╦╣╦╩╦╠╔═╬╚╩╠╝
║╦╠╬╠╠╦╠╠╦╣╠╩╠╬╩╣╩╔╩║║╩╦╠╠╩╦╬║╚╦╩╠╩╠╬╦║╩╩╦╣╦╩╝╠╩╠╝
 ╬╣╦╠╬╠╩╔╣╩╬╣║╩╩╬╩╬╦╦╬╚═╣╠╦╩╩╬╠╬╩╠╚╣╣╩╦╠╩╩╠╬╩╩╠╦╣╣
╔╠╩╩╠╗╣╣╦╗╩╦╦║╬╣═╣╩╦╠╩║║╦╩╬╩╣╠╣╣╗╩═╣╠╔╩╣╦╣╝╠╠╣╩╦╬╝
 ╠╠╦╬╠╔╣╝╝╬╗╗╣║╦╠╣╦╦╚╣══╩╝╣╦╦╦╔╬╩╝╣╚║╬╚╝╠╬╝╣╣╬╣╠╣╣
╠╦╩╬╬╣╚╝╠╬╦╦╩╬╠╬╦═╠╣╣╠╠╝╬╬╦╣╗╗╩╩╬╬╩╣║╣╣╦╦╬╣╩╠╠╠╠╩ 
║╚╦╬╩╠══╬╩╬╦╩╬╩╣╬╩╬╠╠╬╩╦╠╣╩╬╩╩║╦╩╩╚╬╚║╚╦╬╝╬╩╩╩╝╠╬ 
║╝╬╠╦╠╠╩╣╩╠╩╠╦╗╠╬╠╔╠╗╩╬╣╠╠╬╬╔╬╦╣╣╬╣╦╩╩╦╝╬╬╬╦╬╩╠╦╚║
╠╬╦╬╩╠╣╬╣╣╣╬═╦╬╠╠╩╠╠╚╣╣╗╣╣╩╬╗╠║╦╩╩╠╣╠╝╠╬╬║╣╩╣╚╦╠╩╗
╠╩╬╩╬╦╦╚╦╠╬╠╣╬╩╝╠═╬╬╣╣╣╣╝╠╣╬╚╦╠╩╩╬╣╬╬╩╠╠╬╬╦╦╦╝╩╠╦║
 ╦╗╝╣╚╚╩╬╦╣╬╦╠╦╬╬╦╬╗╦╠╬╬╩║╠╬╝╦╠╣╩╩╚╦╦╠╗╬╦╩╣╬╩╠╣╦╠╣
╔══╦╩╦╣╣╩╦╝╬╬╩╣╠╩╬╣╣╬╬╠╬╩╣╩╠╩═╠╠║╩╣╩╦╗╣╦╣╬╦╝╝╠╣╣║╣
╠╦╦╠╣╬╦╬╦╬╦╦╩╣╩═╦═╚╬╬╦╣╠╬╣╗╣╣╬╣╣╔╠╦╦╬╝╝╦╣╚╝═╣╣╦╠╝╣
╔╬╣╩╬╬╠╦╣╦╣╠╩╬╣║╠╠╦╩╣╠═║╣═╩═╦╩╩╦╣╬╔║╬╣╣╣╬╣╣╬╣╠╦╣╣╣
 ╚╩╩╝═╝═╚═╩╝╚╩╩ ═╩╝╚═╩ ╚╚═╝══╝╝╩╩═╚╚═╚╚ ══╝╚ ══╝╩█
$ ./maze-solver-spa -s 50x50-03.txt 
No path
█═╗═╗╔╔══ ╔╦═╦═╦═══╦╦╦╗╔╗╦═╦ ╔═╔╗╔═╔╔╦═╔═╗╗═╦╗╠║╠╩╔╣╚╣╠╣╬╦╬╦═╬╚╩╣╚╬╦╦╣═╠╦╬╠╩═╩╬╦═╬╦╠╗╠╬╠╣╚╩╣╣╦╗
╔╬╬╣╣╩╣╩╦╠╩╩╠╠╩╣╠╩╬╬╩╣╝╩╦╦╦╦╬╦╠╦╬╣╬╦╬╣╚╦╣╦╦╦╣╦╣╬╣
╚╚╬╦╦╗╠╬╠╠╣╦═╬═╠╔╦╗║╩╦╔╬╚╣╩╣╣╬╚╗╩╣╣╬╬╦╩╣╩╬║╩╦╩╗
╔║╬╠╦╬╔╩╠╣╠╣╣╦╣╗╝╚╣╠╠╬╬╗╬╬═╠╩╣╣╣╬╠╠═╠╣╦╣═╦╣╦╦╠═║╔╠╬╠╦══╦╣╠╝╠╦╦╦╣╠╬╣╩╬╬╦╦╗╠╦╬╣╠╬╬╬╣╠╣╣╣╬╣╔╣╣╣╬╣
╚╩╩╣╣╠╣╦╩╣╬╦╩╦╠╬╩╠╝╠╩╣║╦╗╠╣╬═╔╝╦╬╩╣╬╣╦╦╚╣╣╬╦╩╗╣╬╣
╠╦╠╠╠╦╠╠╬╬╦╠╬╦╣╠╚╣╦╣╩╣╩╣╣╔╣╩╬╣╦╣╦╣╬╩╣╦╩╚╦╠╣╠╬╩╩╦║
║╦╩╠╠╬╚╠╣╠╩╩╦╦╣╦╬╬╔╬╬╝╦╬╬╦╩╩╣╠╠╣╬╠╩║╠╩╣╠╬╣╦╬║╬╠═╗
║╣╠╠╠╔╠═╦╦╠╬╩╬╬╩║╬╠╣╠╬╝╬╦╣╠═╠╩╩╣╬╣╩╦╦╗╔╦╔╦╦╬╝╠╣╣╠╣
╚╩╠╚╣╣╦╬╩╣╣╩║╠╠╣╦╩╠╬╣╬╝╬╩╦╩╦╠╬╬╣╩╣╠╬╩╠╬╠╠╬╣╬╠╣╣╩╦╝
╚╬╦╬╩╣╩╠╦╠╬╗╠╠╠╬╩╩╠╣╣╝╗╬╠╦╣╩╦╦╦╔╬╗║╬╦╩╣╣╬╦╩╣╚╣╣
╚╦╠╬╠╣╠╚║╝╣╝╬╠╠╦╣╠╬╬╦╠╣╣╔╩╦═╬╩═╣╠╣╔╔╬╩╣╠╦╠╠╠╣╠╦╗
╠╣╦╠╠╩╣╠╬╩╦╣╠╠╗║╚╬╦╣║╔╗╩╣═╬╩╠╬╦╩╣╬╩╠╬╬╠╣╠╬╣╗╣╩╬╦╠╝
 ╦╣╦╦╣╬╠║╦╩╔╬╠╠╠╠╣╦╩╩╝╬╩╣╠╩╣╠╣╗╦╦╠═╔╣╩╣╔╬╠╦╠╬╠╗
║╣╦═╠╬╬╣╠═╠╩╬╬╝╬╔╦╠╩╩╬╚╚╦╦╣╩╦╣╣╦╣╠╣╬╩╩╬╣╩╠╬╬╦╦╩╦╣
╠║╩╦╦╦║╩║╦╬╦╣╦╩╩╣╩╬╠╣╩╣╬═╬╦╠╦╣║╩╣╩╦╠║╩╬╠╩╔╣╩╣╩║╣╣
╔═╩╣╦╣╩║═╗═╩╦╣╦╦═╩╚═╠╩╦╩╦╠╔╩═╦╣╬╝╠║╚╩╦╔╬╣╦╚╩╣╠╗
╔╩╬╩╬╣╬╬╗╣╩╠╩╦╦╦╩╦╣╣╩╩╬╬╗╦╦╩╣╩╬╠╦╣╩╬╬╣╬╬╠╩╩║╩╦╣║
 ╬╬╣╣╦╠╠╦╦╦╬╩╔╣╦═╠╩╩╠╬═╬╠╬╬╩╩═╠╦╗╦╦╦╦╩╣║╬╦╠╦╠╬╦╬╣
╔╣╠╝╠╬╬╬╠╩╚╦╚╣╦╦╣╬╦╬╦╩╦╣═╣═╦╠╣╣╬╠╠╦╦╩╩╦╦╦╠╬╦╠╦╣╣╩╣
╔╦╩╣╩╝╬╣╩╩╬╣╬╦╦╩╚╬╔╠╩╠╠╗╠╣╠╩║╠╩╣╠║╣╠╠╝╩╣╩╬╦╣╬╠╣╣╠╬╚╠╣╝═╦╦╬╬╬╬╠╠╩╦╩╦╠╩╣╦╦╣╠╬╦╬╬╩╣║╔╠╠╩╚╦╩╩╠╠╦╠╬╬╗╠╩╬║╔╩╬╣╣╣╩╠╬╠╬╠╬╝╣╩╦╠╬╬╔╣═╣╦═╬╩╣╣╬╦╠╦╬╠╩║╝╣╬╣╬╣
╔╠╦╬╠╦╬╬╠╩╩╩╩╠╠╦╠═╠╠╠╣╩╩╬╠╬╩╦╬╩╬╬╝╬╣╠╠╣╦╣╠╣╬╩═╗╠╣
╠╣╩╠╦╣╣╦╬╩╣╣╦╠╩╩╬╦╠╦╔╠╚╬╦╣╦╦╠╩╣╠╝╠╠╦╣╩╬╬╠╬╩╣╦╩╬║╝
 ╣╠╬╬╬╦╩╣╠╦╩╠╬╩╦╣╗╣╦╬╠╠╦╬╬╦══╔╦╬╣═╬╩╩╩╦╩╬╠╦╬╠╗╩╬╬║
╠╔╦╠╬╠╩╩╔╠╣╩╬╦╣╝╠╬╬╬╣╬╠╩╦╣╠╩╦╗╣╦╩╦╗╦╗╬╩╩╩╠╠╩╣╠╠╠╩╝
╚╣╗╝╩╠╬╬╣╦╩╩╠╬╣╠╩╬╦║╬╠╗╠╦╣╦╠╝╦╦╣╠╝╠╦╬╠╣╩╦╩╠╠╠╬╬╣
╠═╣╠╣╬╦╣╬╩╩╦╣╠╠╬╬╣╣╣╠╣╝╚╬╩╦╠╣╦╬╝╠╦╠╩╣╩╣╣╩╣╩╣╩═╝╠╩╩╩╠╣╩╚╠╩╦╦╩╩╦╔╠╣╬╩╩╩╦╣╚╦╬╦╩╔╩╝╠╔╩═╬╦╣╠╩╣╬╣╔╣╬╦╦ 
╔╦╬╩╦╣╠╦╩╬╩╬╦╬╠╠╬╠╦╦╠╣╠╩╩═╣╣╠╬╩╠╠╩╩╦╬╝╠╦╩╣╣╦╩╠═╗╗╠╠╦╔╬╦╩╠╝╗╗╬╣╩╬╩╩╬╠╣╠╬╬╩╠╠╣╬╠╬╩╬╬╠╚╦╠╣╦╔╝╠╩╩╬╬╦╩╠ 
╠╠╦╩╣╩╣╠╩╩╚╠║╩╦╬╦╦╠╬╦╣╔╩╣╩╬╦╣╣╩╩╗╣╔╣╩╝╩╣╣╩╩╠╣╣╣
║╠╝╣╗╬╣╠║╬╦║╬╠╩╬╬╩╬═╩╦╬╣╬╬╠╠╠╣║║╠╠╦╠╦╣╗╦╔╠╬╬╣╦╩╣
╚╦╬╬║╬╬╠╠║╣╠╠╣╩╣╦╬╠╠╣║╠╣╠╠╩╣╠╣╬╩╦╦╠╦╦╣╣╩╩╣╩╩╦╣╠╠╩╝
╔╚╬╗╠╣╦╣╬╬╦╩╩╣╩╣╬╠╚╩╩╬╣╬╠╩═╩╠╦╚╦╣╦╬╩╣╗╦╣╩╦╬╔╦╬╝╚╦╣
╚╬╦╬║╬╦╩╩╦╣╦╠╦╦╦═╩╔╣╗╩╩╦╠╣╬╦╠╬╣╩╚║╩╝╣╦╬╬╠╦╣╠╠╝╠╝
╔╝╦╩╩╦╩╣╬╣╣║╣╝═╩╣╦╦╬╠╚╗╩╩╠╦╣╠╦╦╬╝╚╦═╣╩╬╣╦╝╦╬╗╣╬╬╝
 ╠╩╦╚╠╩╬╬╦╣╠╬╦╩╦╬╬╩╬╝╦╩╦╩╣╠╬╠╠╣╚╣╬╠╠╠╩╠╠╦╩╔╬╠╠╩╣╗
╚╠╣╣╔╣╣═╣╬╝═╦╩╣╬╦╔╠╩╦╬║╬╣╬╗╠╬╬║║╬╩╬╔╩╔╠╬╔╬╦╦║╠╗
╚╦╬╚╠╝╦╬╬╠╠╣╦╠╣║║╚╬╠╦╦╝╣╚╬╔╩╬╬╦╩╦╔╬╩╠╦╩╚╠╠╩╠╠╠╦╦╣
╚╗╬╩╚╩╬╬╣╣╚╦╣╝║╣╠╬╠╬╬╣╠╬╬╔╬╩╬╩╣╩╦╩╠╩╩╩╣║╠╩╠╬╣╦╗╣
╠╬╦╠╬╩╝╩╬╩╣╩╬╦╠╩╦╠╠╩╬╩╦╦║╬╠╣╣╬╣╬╦╗╗╦╣╦╬╩╩╬╦╩╬╦╬╩╗║
╔╦╠╦╠╬╣╦╠╦╠╩╣╬╦╦╠╦╠╔╩╩╣╩╦═╠╬╦╝║╩╠╠╣╦╔╣╠╦╬╬╦═╩╦╩╬═╣
╔╣╠╦╩╠╔╣╣╣╩╬╬╦╦╦╬╬╬╠╩╣╣╠╩╦╩╦╩╬╦║╬╬╣╣╠╦╔╬╠╬╦╠╗╣╣
╚╣╬╠╠╗╠╬╠╣╣╝╠╣╬╦╦╣╦╬╬╚╦╩═╔╩╦╣╦╣╠╠╦╩╩╬╣╬╣╔╝╦╣╦╣╩╠║
║╠╬╦╩╬╩╣╬╔╦╔╬╣╦╦╣╩╬╠╗╣╩╣╚╩╠╩╣╦╩╬╣╣╠╣╦╦╔╦║╠╬╦╗╬╣╩╬╗
╚╬╠╝╣║╣╬╦╦╣╠╣╬╬╬╩╦╬╦╬╠╦╠╩╦╦╬╩╦╦╬╬╦╣╩╦╬╬╠╠╦╬╠╣╣╣╣╝╚╩╩═╩ ╚╚══╩╩╝╩╩╩╩╩╩╚╝╩═╚╩═╝╚╝╩╩═╩ ═╩ ═ ╚╩╩═ ╩╩╝

The program will turn the colour on and off for each single character. That is rather excessive, especially for the coverage map we just showed. So I have fixed it by merging the «span» tags. Manually... (Feel free to have a go at fixing the program.)

$ ./maze-solver-spa -s 50x50-04.txt 
Path: ESSSSEESESSESSSWSESSWWSEEENEEEESENNEEENEESSE
  SEEENEEEEESESEESESEESSEEEESESSESSSSSSESSSWSEEESS
  EEEESEESSESESSSSWSSESSSSES (with length 118)
█╦ ╦╦╗╦╗═╗╦╦╗╔╗╦╦ ═╔╔╦═╦═╗╔  ╦╦╗ ═╗═ ═ ═╦╗╦╔╔╔╗╔╔ 
╠╦╦╬╠╠╩╣╣═╬═╝╬╦╬╠╩╬╦╬╬╣╬╚╦╠╩╩╠╩╣╩╣╩╩╠╬╔╦╩╩╣╬╩═╦╣╝
╠╣╩╬╣╝╬╦╦╠╩╠╦╩║╣╩╠╬╔╬╠╬╩╬╩╩╣╩╔╚╩╠╦╩╩╩╩╬╣╬╬╬═╦╦╗╩║
╚╩╩╩╦╣╠╠╠╠╠╩╦╬╦╣╣╩╩║╣╣╩╩═╩╦╠╦║╦╩═╬╣╣╩╗╦╦╩╦╣╩╣╬╦╠╗
╚╬═╣╠╠╠╦╚╔╦╩╩╬╝╠╩╦╠╩╣╬╦╬╠╦╚╬╔╬╠╩╣║╩╣╬╬╩╣╔╚╣╩╩╣╬╣╠╝
 ╩╠╠╣╣╦╣═╣╩╦╣╠╬╣╣╣╩╠╬╦╩╔╬╬╣╣╠╠╦╠╚╩╝╣╣╬╩╦╬╬╣╣╬╠╬╩╬ 
╠╠╦╬╩╠╝╦╣╬╩╩╬╦╩╠╩╦╬║╦╦═╝╔╠╬═╬╬╩╬╩╦╬╬╠╬╣╣╦╩╠╠╠╬╠╬╝
╠╣╩╩╩╦╣╩╣╠╬╬╠╦╣╣╦╬╩╦╩╣╩╩╣╗╠╠╦╦╩╣╦╩╣╦╣╩╬╬╠╩╠╣╩╩╦╦╦╗
║╠╩╠╦╬╦╠╠╣╬╣╦╝╦╬╣╩═╦╩╩╠╦╬║╠╩╩╣╦╠╠╬╗╦╣╩╬╦╣╣╠╩╬╬╠╠╗
╔╣╩╬╣═╔╗╔╝╬╦╠╠╩╔╝╗╠╦╦╠╣╬╦║╚╬╦╦╣╠╦╚╦╠╩╩╬╦╣╦╩╬╬╣╬╩╣
║╩╩═╔╝╬╦╠╦╠╔╣╣╦╩╝╦╦╬╣╠╦╬╦╬╣╣╚╣╦╬║╣╬╩═╦╣╣╚╣╩╬╣╣╬╠╦╣
║╣╩╣╬╦╠╬╦╦║╩╣╣╦╩╬╠╬╚╣╬╬╬╬╚╣╩╚╬╠╩╚╣╗╠╩╠╔╬╬╠╬╠╠╩╬╣╠╗
╔╩╦╣╩╬╬╠╔╩╠╬╩╣╝╦╠╩╣╬╦╩╣╣╣╣╠╣╣╣╠╗╣╣╩╠╩╩╩╩╣╬╩╦╣╣╝
╠╬╦╠╦╣╠╩╦╦╦╠╬╩╦╠╠╣╚╔╬╬╩╬╩╣╠╦╬╩╣╬╣╩╩╬╦╠╦╦╩╬╩╬╬╬╣╩║║
╚╩╩╬╦╦╬╦╠╠╠╩╠╩╦║╦╬╦═╣╣╩╩╣╬╣╬╦╠╠╬╠╩╩╠╠╣╗╠╣╦╚╩╠╦╣╣╬╝
 ╬╣╣╣╩╠╩╦╬╦╔╣╬╣╠╩╩╠╬╣╣╬╦╬╬╠╦╬╩╠╠╦╬╣╔╬╠╣╦╬╬╬╦╦╬╔╩╩╣
╚╬╦╗╠╣╬═╩╣╩╠╣╦═╠╦╬╣╦╠╣╣╬╣╣╠╣╬╦╠╬╣╠╬╦╬╝╠╬╠╣╦╬╠╠╣╬╣╣
╠╦╩╠╝╩╩╬╣╬╩╦║╩═╬╣╠╩╦╔║╩╬╠╬╣╬╣╬╦╬╬╩╔╠╬╬╔╝╦╣╦╠═╣╠╦╠╣
╠╠╣╠╠╣╩╠╔╦╣╦═╩╦╠╠╬╦╩╣╩╣╠╩╦╣╦╩╩╦╠╠╬═╝╩╣╠╚╦╬╩╬╠╗║╦╗
╠╬║╩╩╩╬╬╦╩═║╚╗╣╣╬╬╚╦╚╚╩╩═╬╠╩╣╝╩╬╦╦╦╣╠╠╠╦╠╣╩╦╠╠╠╠╬╣
╠╩╦═╠╦╦╣╗╔╬╬║╩╦╠╣╠╬╦═╦╦╬╣╠╩╗╣╩╠╬╦╠╠╩╦╩╝╗╣╩╬╩╦╬╦╦╩╣
╠╦╠╣╦╝╦╣╠╩╩╬╣╝╣╠╦╣╠║╣║╣╣╠╦╦╣╣╦╣║╝╠╬╦╠╬╣╦╩╦╣╬╬═╩╝╣
╠╦╗╠╣╦╠╣╣╔╠╦╬╣╦╬╚═╣╦╩╬╠╦╣╩╣╣╣╣╠╣╣╠╝╬╠╗╦╩╬╠╣╣╦╝╣╬╩╝
╠╠║╬╩╬╦║╬╔╬╩╬╩╣╗╩╣╬╣╩╠╔╠╠╚╦╦╦╠╣╠╚╠╬╠╦╣╠╣╣╦╣╣╠╣╬╬║
╚╣╬╬╣╣╣╝╩╣╠╠╩╬╗╣═╩╩╠╔╩═╚╠╦╩╚╚║╬╩╬╗╦╣╬╣╬╣╣╠╣╠╦╦╠╩║
║╬╠╩╠╦╣╦╩╦╠╣╣╠╠╬╣╩╣╝╩╦╬╬╦╩╣╠╩╣╣╣╬╩╚╩╦╦╣╦╣╬╦║╣╬╬╣╣
╔╬╠╬╣╣╩═║╚╬╠╬╠╬╦╦╠╣╣╩═╬═╣╦╠╩╠╩║╩╗╬╩╬╣╗╣╩╬╬╗╣╣╗╣╩║
╠╠╬╦╦╩╠╦═╣╣═╚╣╣╩╣╬═╝╝╚╩╝╩╦╦╣╦╠╩╬╬╦╬╝╩╦╣╦╦╠╠╗╦╦╬╣ 
║╩╣╗╩╠╠╦╬╩╩╣╬╠╠╬╩╦╣╬╦╣╠╠╬╦╩╗╠╩╦╦╠╦╬╣╬╬╣╦╗╣╠╚╔║╩╬╬ 
╔╠═╩╦╩╬╦╦╦╩╠╠╗╣╦╬╣╣╬║╣╝╩╦╬╠╬╬╩╣╦╠╦╚╦╩╬╣╦╠╣╣╩╗╩╠╠╣
╚╣╔╠╬╣╠╩╣╬═╦╠╦╠╠╬╩╬╣╣╦╦╩╦╦╣╦╔╠╠╣╦╩║╩╝╬╩╠╦╣║╬╬║╩╩╝
╠╣╣║╩╣╠╩╩╠╦╦═╦╣╦╣╦╬║╠╬╩╩╩╠║╚╦╠╠╠╠╠╣╬╚╦╩╩╩║╩╣╠╬╦╠╠║
║╬╬╦╠╦╣╣╦╩╦╠╣╠╩╦╦╚╗╔╦╗╠╦╠╠╠╠╬╩╠╠╦╩╣╣╦╬╬╦╬╣╩╚╔╣╬║╠║
╠╦╬═╦╬╦╬╦╗╦╦╩╦╠╩║╝╦╩╬╩╬╣╩╦╣╦╠╦╔╬╦╠═╩╗╣╬╬╩╚╩╗╠╣╣╦╝
 ╗╬╣╬╠╣╦╬╠╦╩╩╠╬╠╬╣║╠╠╩╗╦╬╬╬╩╩╩╦╣╩╣╠╬╩╣╬╗╬╩╩╬╣║╩╣╚╣
╔╩╩╣╬╦╩╬╔╣╩╣╠══╣╦╬╣╬╬╣╚╩╦╦╬╦╩╠╦║╩╦╩╚╣║╩╠╣╦║╦╠╬╣╠╬╝
║╩╣╩╩╩╦╠╣╦╬╬╗╣╩╣╦╣╩╔╝╬╣╠║╬╠╦╠╩╠╣╦║╠╣╣╩╬╩╣╬╦╩╣╩╣╦╣
╠╬║╬╣╬╠╬╔╩╩╦╠╣╩╬╩╦╬╣║╦═╣╦╠╩╦╦╠╬╦═╣╔═╩╗╬╩╣╩╣╬╝╣╩╦╠╗
╔╦╣╣╣╦╦╠╦═╦╩╠╦╣╦╦╦╦╠╝╣╦╚╣╝╣╠╚╦╬╩╠╬╩╦╔╦╬╦╦╝╠╠╩╦╬╬╣╣
╔╬╚╩╩╩╩╦╠╬╠╩╠╬╣╬╩╩╣╩╦╦╣═╦╔╩╠╠╣╣╝╣╦╩╬╦╣╠╩╦╔╩╬╬╠╦╦╝
╚╚║╩╗║╠╚╣╬╣╦╚╦╬╩╔╠║╦╩╦╦╩═╦╠╬╦╦╗║╣╦╬╠╩╣╣╩╠╬═╬╣╠╬╩║
╠╣╦╦╩╣║╬╬╬╠╩╬╬╩╦╠╩╠╣╦╝╩╠║╬╣╦╩╦╦╬╩╝╗╦╬╣╔╝╗╠╠╠╣╣╔╠╗
 ╬╣╣╦╠╦╣╠╠╠╠╩╣╣╦╦╦╬╩╣║╣╣╠╔╠╣╣╣╦╬╣╣╠╦╬╦╔╣╦╬╣╔╩╩╗╠╩╣
╠╩╦╬╬╦╚╩╠╦║╩╣╦╦╠╬╬╣╬╩╩╦╬╬╩╣╩╬╣╦╠═╬╣╣╠╝╩╣╗╣╩╠╠═╦╗╝
║╣╠╣╬╦╣╣╦╦╬╩╣╣╠╦╔╬╩║╠╦╚╗╦╬╝╩╩╬╦╬╦╠╩╠║╦╦╩╣╬╦╣╬╩╠╠╗║
╔╠╠╬╣╩╦╚╦╣╗╦╠╬╦╣╦╦╔╠╦╣╣╩╦╬╠╔╦╦╦╠╬╦╬╣╩╣╦╠╠╬╩╦╣╩╬╠╣
╔╠╣╣╠═╩╣╩╠╣╬╩╦╦╬╬╚╣╩╩╣╠╩╠╠╩╩╬╦╬╦║╣╬═╗╔╣╠╠╦╣╦╠╩╠╩╝
╔║╦╬╦╦═╣╠╩╬╬╬╦╬╩╣╩╣║╣╦╩╣╠╔╠╠╔╦╦╬╣╦╬╣╬╩╬╣╩╝╩╦╠╗╩╩╝
╔╩╠╦═╩╠╦╣╝╦╬╬╬╠╦╚╔║╣╠╦╦╩╬╚╬╔╬╣╠╔╩╣═╣╠╣╩╠╦╣╚╬╩╬╠╩╩╣
╚╝╩╝╚═╩╩ ╩╚╝╚╝╩═══  ╝╚╝╩══╩╩╝╚╩╩╚╩╩╝ ╩╚═╝═╚╩╚╩╝╝ 
$ ./maze-solver-spa -s 50x50-05.txt 
No path
╔╔═╗╦╦╦╗╔═╦═ ╦╔╗═╔╦╦═╔╦╦╔╔╔╦╔╦════╗ ╗═╗╔╗╦╔═╦╔ ╦╗
╠╦╩╩╠╠╣╠╬╦╬╬╣╩║╦╬╣╬╩╩╣╣╣╦╠╔╦╩╣╦═╬╬╬╬╦╣╬╬╦═╦╝╬╠╩╬╝
║╦╠╠╬╬╬╦╦╠╩╩║╠║╬╣╬╬║╦╠╠╝╬╣╦╩╩═╦╦╩╠╬║╗╚╦╔╩╣╣═╣╦╦╦╦╣
╔═╦╠╩╠╬╦╠╠╩╚╦╦╬╠╬╦╩╦╠╬╩╣╬╩╦╠╦╠╩╦╦╝╩╦╦╣╣╠═╦║╦╩╩╩╠╩║
╠╣╬╩╗╩╣╦╬╗╠╬╦╩═╦╬╚╬╦╩╣╩╣╬╣╣╣╚╦╦╦║╩╩╩╣╩╠║╩╠╦╬╣╣╦╩╠╣
 ╝╩╩╦╣╝╦╦╬╬╩╦═╬╚╬╦╬╩╣╩╦╠╦╦╦╠╦╦╦╦╔╩╠╬╝╦╬╦╠╠═╣╩═╦╠╬║
║╩╬╦╩╩╝╣╠╩╦╝╩╔╩╦╠╩╣╩╩╩╬╬╦╚╗╦╣╠╩╩╦╬╠╬╣╣╦╩╦╦╬╦╬╦╬╬╬╣
║═╣╣╩╦╦╠╦║╬╬╦╚╗╔╬╣╦╣╝╠╩╠╣╬╬╦═╦╩╠╣╠╠╦╦╠╗╦╠╦╠╬╚╦╩╣╠╣
╔╩╣╦╬╬╬╩╠╦╩╠╦╣╣╬╣╠╬╬╬╬╦╩╩╦╬╔╝╩═╬╬╩╦═╣═╣╦║╠╩╩╣╠═╬╦╝
╠╦╩╬╬╠╦╬╣╦╠╣╠╣╩╩╩╣╣╦╠╔╣═╩╦╦╠╬╦╠╩╦╦╦╠╝╣╔╩╩╠╩╠╣╩╣╩╠╣
║╦╩╠╚╔╗╔╩╠╔╣╩╣╣╬╣╠╠╣╠╦╠╣╠╠╬║╝╬╠╩╠╠╣║╣╚═╬╣╠═╩╩╩╣╩╩╗
╔╠╠╗╠╩╩╦═╔╣╦╣╦╠╬╩╬╦╠╣╣╣╣╦╠═╣╦╣╣╬╣╣╦╦╠╠╣╣╬╦╠╠╦╣╣╩╠╗
╠╩║╬╠╗╬╬╦╦╬╬╝╬╠╠╦╩╦╩╩╠╬╩╚╣╣╔╠╬╣║╩═╬╦╦╩╝╗╣╦╩╚╩╬║╣╬ 
 ╣╠╬╠╣╬╠╠╗╩╣══╩╣╣╣╣╠╦╬╣╦╠╩╣╣╬╣╬╦╠╬╩╬╠╠╬═╣╦╣╔╠╣╣╝╠╝
╚╣╦╠╬╣╠╦║╝╚╦╠╣═╩╣╩╬╗╦╦╩╠╦╚╩╣╩╔╦╩╠╦╣╚╣╣╬╠╩╩╬╦╦╠╬╔╣╣
╠╬╩╠╬╦╬╝╬╠╠╣╩╩╠╦╣╣╬╦╩╣╩╩╬╦╠║╠╣╦╩╦╬╩╣╩╩╩╩╬╚╩╣╗╝╩╬╣╣
 ╬╬╗╩╩╠╦╩╣╗╦╣╣╦╗╣╩╔╩╚═╠╦╠╣╬╠╗╣╣╦╦╩╦╚╬╦╠═╩╝╠╩╦╬╩╩╠╝
╠╠╚╣╣╩═╩╠╠╦╬╦╠╚║╦╣╣═╩╣╠╣║╦╩╦╣╣╠╠╣╠╦╬╩╦╦╣╦╣═╩╦╦═╩╠╣
║╣╗╩╔╣╠╦╩═╬╩╦╦╬╩╩╬╣╩╣╩╩╩╩═╚╗╬╦╠╣╣╠╠╣╠╬╣╔╣╦╦╣╩╩╗╬╣╗
╔╬╦╣╦╩║╬╠╦╦╠╩╦╬═╬╦╦╩╬╦╬╩╩╦╣╣╣╦╦╠╠╠╣╩╬╦╦╩╠╬╩╠╔╬╦╩╩║
╠╦╬╠╣╣═╦╣╩╚╣╬╩╔╦╣╬╦╝╣╣╣╩╬╦╬╔╝╬╣╣╦╠╣║╦╦╝╠╠╬╬═╠╠╠╬╩╝
 ╩╦╩║╚╩╦╠╣╩╠╦╬╠╬╬╩╣╠╬╬╠╬╬╬╠╬╠╣╗╣╦╔╬╠╠╦╩╦╦╬╠╗╬╩╩╠╦╣
╠╠╗╣║╠╦═╔╩╠╝╝╣═╩╬╠╦╠╬╣╩╬╣╦╣╬╦╠╦╠╦╩╔╦╣╩╩╠╣╩╬╩╩╩╦╩╦╣
╔║╦╣╬╦╩╔╠╚╣╠╣╠║╩╦╦╬╦╣╦╣╣╠╩╠╬═╩╠╣╣╬╬╠╬╗╦╬═╠╩║╦╩╠╩╬╗
╚╣╬╠╬╠╩╩╦╦╦╩╔╬╔╣╠╣╣╦╩╣╩╬╣╦╠╬╣╦╬╠╦╠╗╩╠╦╣╦╣╩╬╦╬╦╠╦╠╝
 ╬╚╬╩╚╬╬╣══╠╦╩╩╦╩╠╠╩╣╦╩╬╬╣╩╩╩╣╠╣╦╬╩═╣╝╩╦╠╠╩╣╠═╦╬╩╗
║╦═╩╬╦╦╩║╣╦╚╠╔╠╣╠╦╣╠╠╦╦╦╩═╣╬╦╠╠╦╣╣╣╣╦╬╠╦╝╦╬╬╝╣╬╦╩║
╠╣╠╠╚╠║╦╩╬╣╚╬╠╠╠╚╦║╬╬╣╩╦╝╠╣╔╦═╗╣╩║╠╬╠╦═╩╩╦╬╩╬╣╠╠╣╗
╚╠╩╣╬╩╬═╦╩╚╠╦╠╦╣╣╩╚╬╗╦╔╬╩╦╬╦╩╔╣╠╩╩╠╠╣╩╬╬║╦╠╠╣═╦╣╬╣
╚╠╩╠╠╦╩╦╠╬╦╦╦╝╗╣═╩╬║╣╩╗╬╣╠╩╠╣╩╣║╦╩╩╠╠╦╔╠╦╬╩╩╦╠╠╩╬╝
╔╦╬╣╠╩╚╠╬╠╦╦╣╬╦╩╦╠╣╬╬╬╦╩╬╬╩╩╣╔╦║╬╣╣╣╦╩╦╩╩╠═╗╦╬╗╦╬║
║╣╣╩╬═╩╩╬╗╬╦╩╬╠╩╠╣╦╬╩╬╦╠╦╠╣╚╦╦╬╠╣╣╬╦╩╣╠╬╩╦╬╣╩╩╠╚╬║
╠║╬╬╠╩╠╩╩╝╚╣╗╬╣╬╩╠╩╬╬╩╬╦║╩╗╚╦╬╠╬╩╠╦╬╩╠╬═╚╦╦═╝╝╦╦╠╣
║╔╬╠╦╝╦╩╠╩║╦╩╣╠╦╦╩╗╣╬╣╣╠╦╦╩╬╦╩╣╬╩╩╩╩╠╦╩╣╦╠╠╦╣╔╬╬║╣
╔╣╠╩╠╦╩╬╗╠╬╣╠╬═╬╦╬╗╚║╠╠╩╬╦╔╩╬╠═╣╦╬╩╩╦╬╬╠╩╩╗╬╠╠╠╬╦║
║╦╦╣╣╦╣╠╣╣╦╠╠╣╦╣╬║╦╠╬╬╩╩╩═╬╠╣╦╣═╣╩╦╦╠╣╬╔╠╬╦╬╩╠╬╦╩╣
╔╣╦╣╠╠╬╣╣╦╠╬╩╩╩╦╚╦╣╣╦╠╬══║╠╠╦╣╦╗╦╦╠╩╠╣╦╩╠╬╠╗╦╦╬╦╠╗
╚╠╬╩╩╦╬╠╦╣╠╩╝╦╬╣╠╔╩╠╬╠╩╬╬╩╠╣╦╣╬╠╦╠╩╝╬╩╣╣╦╩╩╠╣╩╩╬╩║
╚╣╩╦╩╠╬╬╠╦╗╚╝═╦╠╔╣╦╣╦║╣╦╩╚╠╩╣╝╦╠╣╠╝╬╩╠╣╩╬╬╣╬╦╠╬╗╠ 
╠╣╦╣║╬╣╩╝╦╬╠╬╩╠╣╬╦╣╦╣╬╬╔╠╦╠╠║╠╠╬╣╠╚╣╬╠╬╬╬╦╦╠╠╠╠╠╬╗
╠╠╣╩╗╣╝╦╚╦╣╣╝╠╣╠╦╝╚╦╦╦═╗╠╦╠╬╔╣╦╩╔╬╦╩╣╗╠╩╚╠╠╦╩╣═╣╣╣
╠╣╬╬╬╚╣╦╦╦╬╩╠╩╠╦╬╚╩╩╠╣╠╠╩╦╣╣═╣╩╠╦╬╬╬╦╝╣╣╣╠╬╩╩╬╣╬╩ 
╔╣╠╩╦╔╔╦╣╩╔╦╬╬╩╩╣╣╠╩═╦╦╬╬╩╠╦╬╬╣╩║╦╩╣╦╩╣╩╬╣╠╬╣╦║╬╦╝
 ╣╬╬╩╔╩╣╩╠╩╩╩╬╣╩╬╩═╣╣╩╦╠╩╣╣╦╣╩╬╣╦╣╠╩╚╦╚╩╦╣╩╦╣╦╠╩╠╝
╠╩╣╠╣╣╠╣╩╬╣╠╩╝╣║╩╣╗╣╠╩╦╩╩╬╠╩╦╦║╩╦╠╬╬╩╣╬╣╠╦╝╣╦║╦╩╣╣
╠╬╦╩╦╬╔╩╦╬╣╠═╝╩╣╣╦═╔╬╣╦╩╦╠╦╚╣╦╩╬╩╠╣╔╣╣═╣╩╦╦╦╝╣╠╠╠╝
╠╩╣╠╦╣╠╦╩╩╦╩╝╩╦╣╩╣╬╩╠╣╦╣╔╣╠╠╠╬╩╠╬╠╦╚╬╩╣╔╩╬╠╦╩╩╦╠╬╗
║╠╩╬╩╗╦╔╬╩╦╠╬╚╦╩╦╠╬╬╠╩╠╩╩╬╠╬╬╩╣╣╔║╦╣╦╣╦╝╠╗╦╦╦╔╩╣╬╣
╠╬╦╩╬╠╦╠╣╩╩╩╠╠╬╠╠╣╦╠╣╬╬╦║╬╦╬╚╦║╠╬╚╠═╠╩╬╬╔║╬╩╦═╦╣╠╝
╚╚╝═╩╩╩═╚╝╝╩╩═╩╚╝╩╚═╝╩═╩╩═╩╝═╝╚ ╩═╝╝╚═╚═╝╩══╩ ╚═╚█
$ ./maze-solver-spa -s 50x50-06.txt 
Path: ESSSEEESSSEESSSEEEEEESESSSESSWWSESSSESEEESE
  ESSSSSSESSSSWWSSSSSWSEEEESSSESWSESSESENEEEEEEEE
  NENEEESESEENEEESESEEESSEEESS (with length 118)
█╗═╦╗╦══╔══╦╔╔╗╗═╦╔═╗╦╔╦╔ ╦╦═╗╦╗╗╗ ╦╗╗╗╔╗╦╦╦╗═╗══╗
╚╠╝╬╣╣╬╦╣╦╩╬╦╩╠╦╦╩╦╩╩╣╬╣╬╣╚╬╬╣╦╗╠╣╠╣╦╔╔╩║╣╝╦╦╣╩╠╗
╠╦╣╬╗╩╬║╝╩╦╬═╔╦╚╩╣╣╣╩╩╠╦╦╬╦╣╩╠╠╦╗╣╚╩╝╩╦╝╣╠╩╦╠╦╠╩╗
╔╚╩╩╬╗╚╠╠╩╬╩╠╦╩╣╣╠╦╬╦╠╣╣╬╬╚╠╦╣╣╣╩╠╠╣╠╣╦╦╠╬╦╣╗╦╩╦═╣
╠╗╔╩╦╩╣╣╬╬╬╝╦╣╬╠═╦╩╦╝╦═╣╠╝╩╬╩╠╠╩╩╦╬╩╬╬╠╬╠╩╦╬╠╬╔╠║
╚╣╣╠╠╬╠╩╩╠╠╠╠╦╠╬╚╠╠╬╩╗╔╠╬╦╝╣╩╦╦╝╬╬╠╬╠╦╣╦╠╣╩╬╦╩╦╬╣
╚╠╠╬╩╦╬╬╩╬╠╩╬╦╣╬╬╠╣╦╩═╩╦╠╬╦║╦╠╠╬╦╠╦╠╩╠╩╠╠╦╗╠╬╩╬╣╩╣
╠╣╦╦╣╦╣╩╩╬╣╣╠╬╣╩╩╣╩╦╠╬╦╩╚╦╗╠╠╝╬╦╣╬╩╠╩╣╬╦╩╩╣╩╬╠╬╩╣
║═╬╬╠╬╬╩╣╦═║═╦╬╣╦╦╩╩╝╬╦╦═╩╦╠╠╩╩╔╬╣╬╠╬╬╬╩╬╬╠╩╬╬╣╔║
╠╬╬╣╣╬╬╦╬╦╬╦╬╝║╦╠╬╬╠╩╔╚╣╚╬╬╣╬╩║║╚╦╩╚╬╣╩╩║╠╣║╣╬╠╦╠╣
╠╩║╬╣╦╩╦╩╔╦╦╬╬╬╠╩╬╦╣╩╣═╣╠╣╣╬╩╩╠╬╠╬╦╬╦╠╝╠╦╠╣╦╬╦╩╦╗╗
╔╣═╗╬╩╣╝╩╠╬╬╬╦╩╩╠╩╬╬╠╦╦╣╬╩╬╣╬╦╬╦╠╣╬╬╦╠╝╬╩╠╣╗╠╦╩╩╗
╠╩╬╠═╩╣╬╠╣╣╦╬╩╬╦╠╠╬═╬╣╩╬╠╬╬╩╠╦╩╣╦╦╠╣╠╣╬╣╦╗╣╬╣╩╝╦╗
║╚╦═╔╬╠╝╣╣╣╠╦╬╬╣╬╠╣╣╬╬╬╠╣╣╬╦╬╠╦╩╦╝═╩╬╬╣═╣╗╠═╬╦╦╦╩╣
╠║╩╚═╣╩╩╩╣╣╦╦╦╦╦╦╬╬╩╠╝╩╩╬╬╠╣╣╬╦╬╦╠╦╬╦║╩╦╦╦╣╬╬╦╬╬╝
╠╩╬╣╠╬╣╠╦║╬╠╠╩╣╦╬╬╣╣╗╩╠╦╠╠╗║╦╗╠╚╩╩╠╩╠╠╠╠╦╦╬╬╦╠╣╣╦║
╚═╣╩╣╦╣╬╚╠╣╦╬╦╚╣╔╩╩╬╠╬╠╠╦╬╔╩╩╩╠╦╬╠═╩╬╦╦╦╩╠╩╗╠╦╦╠╩╣
╔╬╚╗╬╦╩╠╦╝╣╦╣╩╩╚╠╗╦╩╦╠╩╬╣╦═╣╠╣╩╗╩╣╬╠╬╩╦╣╩╗╬╦╦╦╣╬ 
╠╩║╦╣╣╣╠╦╦╦╣╣╬═╦╠╠╦╩╩╩╬╦╩╩╬╬╦╣╩╦╣╣╦╚╣╦╩╣╣╠║╦╩╦╬╣║
╚╩╠╣╦╦╠╠╠╠╦╩╦╬╗╗╚╦╠╬╣╣╣╣╚╚╗╩╠╣╠╠╬╣╦╦╦╔╠╩╠╦╚║╠╬╣╬╬║
 ╩╩╣╩╣╠╠╬╣╬╬╦╦╠╩═╦╝╦═╩╬╬╩╣╦╠╔╣╔╦╚╬╦╬╩╩║╠╬╦╦╬║╬║╣╣║
╠╗╗═╦╩╠╩╣╩╠╩╩╩╣╣╬╬╦╣╦╠╦╩╬╩╦║╬╦╩╩═╠╣╝╗╦╬╣╠╩╔╣╠╗╠╬╬╣
╚╚╣╔═╗╠╦╔╣╝╣╠╣╦╣╣╬╬╦╣╬╬╚╣╣║╠╝╬╔╩╬╠╬╚╬╬╠╦╬╗╩╩║╚╠╬╝
╔║╬╣╬╬╠╣╬╦╩╦╗╦╗╠╠╠╦╣╠╚╣╬╬╣╦╦╬╗╬╦╣╦║╔═╠╬╩╣╠║╣╬╔╗╬║
║╠╬╠╦╦╚╠╠╠╩╩╩╬╣╬╠╝╦╦╠╬╦╣╬╩╬╔═║╬╬╬╗╠╠╣╬╬╠╠╦╦╩╬╬╩╩╣
╚╬╦╩╬╦╩╝╬╠╦╠╣╬╬╩╠╩╬╚╩╩╩╦╣╬╣╩╦╬╠╦╠╩╦╦╦╚╩╦╝╠╗╩╦╬╚╣╣
╚╬╠╦╩╗╩╦╚╠╩╠╠╩╠╣╠╩╠╬╦╠╩╩╬╠╣╠╬╦╬╦╝╦║╦╬╠╔╠║╚╬╩╣╣╬╣╗
 ╠╠╣╠╗╣╣╦╬╦╚╦╔╣╬╦╬╔╩╦╩╩══╗═╦╬╩╦╦╬╠╣╠╠╠╬╦╦╩╬╩╝╬╦╣╣╝
╠╠╦╬═╣╩╠╬╬╣╩╠╣╬╠╦╩╦║╣╦╣╣╦╠╦╦╦╦╣╦═╠╣╬╬╝║╠╝╬╬╔╔╦╬╣╣
 ╣╠╚╩╩╣═╣╬╬╬╣╩╬╩╠╦╣╬╩╩╦╩╦╩╬╩╝╬╬╗╣╠╠╩╣╩╗╩╩╩╣╣╠╦╬╠╣
 ╦╩╣╠╣╩╩╠╦╬╦╣╩╣╣╬╠╩╣╦║╦╩╠╦╣╣╝╦╬╣╠╣╔║╣╣╣╩╠╣╣╩╦╔╗╦╣
 ═╣╦╦╣╦╩╣╣╠╣╠╬╬╗╝╩╠╦╣╬╣╦╦╦║╩╠╠╣╠╬╠╦╔╣╣╩╗╬╠╩═╦╠╦╣╝╣
║╦║╣╣╦╗╣╩╔╠╬╦╠╦╩╬╦╦╠╬╠╠╣╬╣╦╬╣╣╣╦╗╠╠╩╠╩╠╩╣╦╩╣╩╣╩╦╣
╔╦╣╣╣╣╦╬╠╦╦╣╠╩╗╦╣╬╣╦╬╠╩╬╦╝║╠╠╠╦╦╦╬══╗╦╣╣╣╠╦╦╠║╩╬╣
╠╠╬╩║╠╣╠╠╦╬╚╦╣╦╦╦╠╦╦╠╩╝╦╦╠╦╣╩╣╗╣╣╩╬╩╦╗╦╠╚╣╠╬╩╣╩╬╗
╠╝╠╬╬╬╦╣╬╠╣╦╣╬╩╩╚╩╬╬╦═╦╬╬╔╩╦╦╦╣╦╩╠╩╦╠╠╔╦╦╦╝╠╦║╝╩ 
╔╬╠╦╩║╚╬╣╦╚╩═╩╣╣╩╠╩╗╝╣╣╠╣╠╩╦╬╣╬╦╠╩╬╔╣╠╬╦╠╩╬╣║╩╣╠╠╗
╠╦╦╔╦╣╩╠╠╔╩╠╠║╚╬╬╠╩╦╬╣╠╬╬╬╩╣╚╦╝╦╣╠╦╣╦╬╔╬╠╬╩╦╦╬╠╠╠ 
╠╦╣╬╠╠╩╬╩╩╩╬╬╬╦╠╣╦╠╠╦╣╦╣╣╩╩║╩╩╣╩╗╩╬╦╠╗╦╦╔╣╦╩╩╬╠╠╣
╚╬╣╬╬╔╬╣╔╩╣╬╠╩╣╬╣╣╠╣╗╣╠╩╠╩╝╠╦╩╣╠╦╣╣╩╠╣╠║╚╦╠╦╬╠╣╦╗
╔╬╩╬╦╦╩╠╬╔╗╣╠╣╩╬╩╦╝╩╣╚╦╣╔╬╬╩╣╗╗╠║╩╗═╣╬╦╦║╔╬╠╣╣╣╬╠╣
╠╩╣╠╠╣╩╬╣╬╬╗╩╔╠╩╩╦╔═╗╦╬╝╦╔╣╩╦╠╣╩╣╬╠╠╩╠╣╩╦╠╠╠║╩╬╩╩╣
╔╩╦╩╗╣╦╝╠║╠╣╦╠╣╩╣╬╩╣╬╬╦╣╣╣╦╩╩╩╝╩╦╦╦╬╦╠╩╩═╠╗╣╩╠╦╬╩╗
╔╣╠╦╦╦╬╦╣╦╣╩╦╣╩╠╩╦╬╣╔╩╩╩╠╠║╠╬╠╩╦╬═╬╠╦╬╬╬╦║║╝╠╣╦ 
╠╠╩╬╦╦╠╠╩╣╦╣╦╚╠╦╣╗╩╩╩╣╬╣╬╦╩╬╩╩╦╬╩╗╦╦╦╬╦╩═╠╩╣╦╚╩╬═║
╠╦╦╬╠╣╔╔╠╬╩╦╩╠╦╠╚╠╬╩╦╣╦╠╩╬╦╣╦╩╠╣╦╩═╠║╠╬╠╦╦╠╬╦╩╦║╣║
╠╦╝╦╩╠╣╣╬╠╠╣╠╔╠╬╦╠╦╩╣╦╩╠╬╣╣╚╠╦╠╠╔═╩╠╠╦╩╬║╬╔╬╠╩╩╠║
║╩╣╩╣╣╣╣╝╣╣╬╩╩╠╦╦╩╗╣╩╦╩╠╬╬╠╠╠╗╣╣╠╬╩╩╝╩╬╣╬╠╦╬╦╩╬══╗
╠╦╩╬╚╩╝╩╠╣╬╔╦╣╦╬╩╬╣╦╠╠╬╦╦╩╣╦╣╣╩╬╠╩╠╩╠╬╬╦╣╠═╩╦══╩║
╚═╝╚╩═╩╝╚╩╝╝╩╩ ══ ╩╝╩╩ ═╚╩╝╝╩═ ╩╩╩╚═ ╩╩╩╩ ╚══╩╩╝╩
$ ./maze-solver-spa -s 50x50-07.txt 
No path
█╦╗╦╔╗═╔═╗╦╦╗╔╦╗╗╔╔╦═╦╦╗╔╔╗╦╔═╦╦╦═╦╦╔╗╗╔╔ ╔╔╔╦═╦╗╗
╚╝╝╩╦╠╣╝╬╦╬╦╣╣╚╠═╩╣╠╩╦╣╩╬╣╩╩╚╝╬╠╩╠╩╦╬╠╠╦╬╦╦╗╔╬╠╚╣╝
║╦╠╬╦╩╬╠╬╣╦╬╣╩╚═╣╦╣╠╩═╦╣╩╬╬╩╠╬╬╩╬╚╩╩╣╠╦╔╠╬╩╬║╣╠╣╣╣
╠╬╦╣╦╩╩╩╬╦╩╬╠╚╩╠╦╬═║╠╬╩╔╗╩╠╣╩╦╔╬╦╦╩╣╗╣╦╠╦╦╗╔╠╦╗╠╦╝
╠╩╣╦╩╠╦╩╣╣╔╠╠╚╩╬╩═╦╦╣╬╦╬╦╣╣╬╠╦╝╬╬╩╩╠╦╦╝╣╦╬╬╬╠╦╣╬╦╗
╠╬╦╦╦╣╦╗╩╦╬╬╩╚═╝╩╠╠║╠╦╣╦╣╩╩╠╠╩═╬╣║╣═║╠╬╬╠╦╠╬╬╠╠╦╠╣
╚╣╦╩╔╦╩╬══╦╠╔╠╗╠╬╝╠╠╦╩╠╩╠═╠╗╣╦╝╬╦╬╩╬╚╦╔╗╬╦╦╦╬╚╬╠╩╗
╔╩╠╦╬╣═╦╠╣╠╣╦╣╗╠╠╬╦╗╚╩═╣╦╠╠╠╝╦╩╠╬╬╩╩╬═╬╠╣═╩╬╣╠╠╣╬╣
╚╣╩╦╠╠╩╣╔╬╬╣╠╩╠╣║╬╠╗╩╩╝╗║╣╩╩╣╚╩╣╠╠║═╬╬╣╠╩╣╣╦╠╦╦╠╦╣
╠╠╦╩╦╬╬╣╩╬╠╩╬╣╬╣╣╩╦╩╩╩╣╩╦╠╣╩╩╠╬╠╩╬╝╠╣╠╔╬╬╣╦╝╠╩╩╠╦║
╔╦╩╩╠╬╬╩║╣╣╦╬╬╣╣╩╠╣╣╦╬╩╦╠╣╝╚╝╬╣╩╠╣╩╣╦═╦╣╩╦╚║╣╦╬╩╦ 
╚╣╬╬╩╦╦╣╣╬╠╦╝╠╔╦╬╦╬╠╦╣╠╦╗╣╠╩╩╔╦╬║╣╦╦╣╣╩╠╠║╦╬╬╣╠╣╩╗
╠╣╠╠╔╩╦║╬╬╣╩╣║╣╩╩╝╠╠╦╦╠╣╠╠╔╩╬╬╦╬╠╦╣╩╩╬╬╠╣╣╦╦═╬╩╦╣╣
╠╠╠╦╩╣╗╦╦╦╦╩╦╦╣╬╬╬╠╚╩╩╣╩╣╬╦╦╠╠╩╦╠╚╩╣╣╠╔╣╩╬╣╗║╬║╠╠╗
╚╦╩╬╠╩╦║╗╩╣╣╬╦╦╣╦╠╣╠═╚╬╦╩╠╬╩╠╬╬╬╣╬╣╠╬╣╣╠╠╩╩╬╩╠╩║╩╣
╔╩╦╬╠╬╝╣╦╠╦╣╝╬╦╩╦╠═╩╩╦╬╬╠╝╦╦╦╬╠╝╬╠╣╣╠╩╣╠╩╩╣╣╬╠╣╣╠╗
╔╣╠╬╣╠╣╣╠╠╬╗╣╗╣╩╣╠╠╔║╠╣╦╩╩╬╬╦╔╦╗╠╬╠╔║╠╬╬╠╩╩╝╚╩╠╠╩║
║╠╣╩═╣╠╦╩╦╬╗╬║╬╚╣╣╠═╣╬╣╦╦╦╦╦╬╬╔╩╚╬╣╬║╠╚╬╩╬╩╠╩║╦╦╬║
╚╣╗╣╬╗╦╬╬╣╣╝╠╝╠╝╩╠╦╬╣║╬╩╠╬╦╩║╠╦╩╠╬╣╩╣╬╠╬╣╣╬╬╣╦╗╦╦╝
╠╬╩╬╬╩╩╠╩╦╦╦╩╬╬╠╚╦╠╠╬╠╦╦╣╝╬╣╠╬╩╩╬╠╩╩╩╣╚╩╦╣╣╣╠╦╣╩╩║
╔╬╬╬╩╚╠╬═╩╣╩╣╬╦╩╠═╣╬╠╬╩╬╩╦╣╠╠╬╦═╦╣╣╠╩╠╠╣╦╦║╦╦╩╠╚╦╝
╠╣╩╬╩╠╠╬╠╩╣╠╩╠╦╬╦╠╠╗╠╣╣╦╣║═╦╣╦╬╣╦╣╦║╠╬╩╔╬╗╬╔╗╚╦╬╠╗
╚╗╠╩╠╣╠╬╩╣╝╩╩║╩╗╣╠╚╠╣╝╬╠╠╝╠═╠═╩═╦╬╩╠╬╠╣╣╬╚╠╩╦╠╬╬╦╝
╠╦╠╦╬╬╦╦╬╬╣╠╦╩╦╚╬╝╦╗╣╠╝╩║╝╩╩╣╦╦╣╔╚╦╠╬╩╦╠╩╣╠╠╠║╣╝╠ 
╠╬╬╦╩╗╣╬╠╬╩╬╗╩╦╬╗╦║╦╣╠╩╗╬╩╚╦╣╩╬╬╬╔╔╬╔╣╚║╦╣╠╣╦╩╬╬╩╣
╔╩╩╦╠╠╣╦╗╣╣╔╦║╝╬╗╩═╠╦╠╝╩╩╬═╠╦╠╦╠╬╩═╣╠╦╠╔║╦╦╣╩╬╬╬═╝
╚╠╣╠╔╣╬╩╣╣╦╠╦╦╦╦╠╩╩╠╩╣╦╝╦╩╣╣╗╩╦╠╦╩╔╦═╦═╠╠╦╣╩╦╩╠╠╩╣
╚╣╠╚╬╦╠╣╠╣╣╠╣╠╬╠╠╩║╠╦╩╦╩╩╩╠╦╗╚╬═╣╣╬╩╩╬╣╬╩╦╣╠╩╣║╣╦╗
╚╣╬╝╦╦╩╦═╣╠╣╬╦╔╣╣╣╬╠╬╦╠╩╣╦╩║╣╠╣╣╦╠╩╣╬╦╦╩╬╬╩╬╩╩╚╦╣╗
╚╦╠╣╠╩╣╚╣╬╣║╩╚╩╬╣╦╠╦╬╣═╠╦╦╬╦╣║╦╬╩╚╩╠╦╩╠╬╩╬╩╦╦╠╣╦╩ 
╚╩╩╦╔╦╦╬╚╣╣╣╣╣╣╬╗╣╬╣╠╬╦╠╩═╬║╣║╠║╬╬╝╬╦╬╣╦╩╬╩╠╣╗╩╣╠╣
╠╠╠╦╠╣╦║╩╦╩╬╦╣╬╝╩╣╣╠╣╩╗╩╩╬╠╣╬╦╦╣╣╗╠╠╣╣╬╣╠╝╣╦╩╚╩╠║║
╠╦╣╣╬╦║╠╦╣╗╦╦╔╬╦╝╠╣╣╠╠╠╩═╬╬═╬╬╬╦╦╬╦╣╣╦╦╠╠╩╠╦╩╩╚═╬╗
╔╚╣╣╝╩╣╩╩╣╦╣╠╬╬╣╬╣╩╠╣╣╝╩╬╦╣╠╠╬╬╦╣╦╩╬╠╩╚╣╔╗╩╠╬╦╦╣╠╗
 ╩╩╚╣╦╦╣╬╗╩╣╩═╣╬╠║╩╠╩╣╣╦╠╩╣╠╩╠╦╠╦╣╚╩╬╗╬╣╩╦╣╚╣╩╦╝║╣
║╩╩╣╣╠╦╬╣╣╩╬╬╩╦╠╩╦╩║╠╗╩╬╠╣╝╬╩╣╣╬╠╣╠╦╗╣╣╠╬╗╝╩╩║╣╦╣║
║╣╦╩╠╩╣╬╣╬╬╝╦═╦╬╬║╩╣╩╩╣╩╣╣╬╬╠║╣╦╬╩╠╩╩╝╗╣╬╣╣╣╦╦╠╠╦ 
╔║╠╦╬╔╚╩╝╣╩╦═╦╩╠╩╩╬╣╬╩╣╦╦╠╬╠╬═╣╚╠╬╩╦╩╦╠╣╬╬╩╣╠╬╣╬╦╣
║╣╦╣╠╩╦╦╩╦╠╦╩╝╠╠╠╣╗╠╠╠║╠╣╣╚╣╬╬╠╣╬╩╩╦╩╬╣╩╠╦╩╬╣╚╝╔║║
╚╩╬╩╔╦╩║═║╔╠╠╠╬═╬╣╦╬╬═╚╣╠╣╬╩╦╣╩╣╠╦╬╔╬╠╣╠╩╠╣╚╩╦╬╗╬║
╚╦╠╬╬╩╚╗╬╬╬║╬╩╬═╬║╚╚╗╦╣╩╦╩╔╩╠╣╠╦╦╠╬╣╚╬═╬╚╣╬╦╬═╣╣╩╣
╠╣╦╗╬╝╠╠╬╬╣╗╠╬╝╣╩╬╣╩╦╣╦╩╝╣╣╣╠╝╦╩╣╣╬╦╦╦╩╦╣╠╬╩╠╠╩╦║╣
╔╣╬╬╦╦╚╠╔╦╬╦╣╗╩╔╣╬╠╦║╬╚╩╣╠╦╠╩╠╣╣╠╩╦╦╣╬╬╠╠╦╠╔╣╬╩╠╩╣
║╬╣╩╩╬╦╩╩╚╬╦╬╣╩╣╗╔╣╦╩╠╣╣╠╝╣╬╦╦╣╠╠╩╩╠║╣╝║╩╠╠╣╦╬╣╠╩╝
╚╩╣╩╝╩╠╠╣╣╠╠╣╬╠╦╠╠╗╩╠╦╣╣╣╬╬╩╠╩╩╣╣╬╣╬╠╩╣╠║╚╣╬╠╣╦╠╬╣
╔╠╦╣╣═╣╬╦╣╬╦╠╬╬╬╩╚═╬╣╠╩╠╣╩╦╦═╬╠╬╠╬╬╦╦╬╣╣╣╦╗╠╬╦╣╬╦╣
║╦╣╠╠║╣╦═╠═╣╗╣╣╦╠╦╣╠╦╠╬╦╠╠╝╣╦╦╬╔╠╠╬╝╣╣╩╠╬╠╦╦╩╣╩╬╬╣
╠╔╩╠╩╦╝╣╬╬╣╠╣╦╦╦╣╬╠╦╦╩╬╬╦╦╔╬╬╦╔╦╩╔╠╬╠╩╣╣╬╗╣╠╠╠╣╠╗╗
╔╩╩║═╣╠═╬╩╦╣╩║╣╬╣╩╣╣╔╬╚╦╦╦╦═╩╠╣═╠╝╬╩╠╣╦╦╦╣╠╠╠╣╣╚╦║
╚╝╝╩╝╝╚══╩╝╝╝═╝═╚╚╩╩╚ ╩ ╩╝╩═╝╚╩╩╩╩ ╩═ ╚╝╚╝╩╝╩═╩╩╝█
$ ./maze-solver-spa -s 50x50-08.txt 
No path
╔╔╦═╦╦╔╦╔╔═╗╦╦╦╦╗═╦╦╗╔╦═╔╦╔═ ╦╔╗╔╦╗╦═╗═╦╦  ═╦╦══ 
 ╝╬╦╬╔╬╠╩╣╗╠╣╚╩╦╠╬╣╩╩╦╗╦╬╣╩╠╬╬╬╠╦║╬╩╩╩╦╬╠╠╣╬╦╩╣╣╬ 
 ╣╠╬╦╣╦╬╦╠╔╣╣╝╦═╣╣╩║╬╩╬╣╬╠╠╬╬╩╣╬╦╣╠╬╠╬╠╣╬╩╦╬╬║╬╔╣╗
║╦╦╠╚╠╦╣╦╠╣╣╩╬╦╩╣╦╝╣╬╣╠╣╣╣╩╣╬╠╦╦╩╠║╬╠╦╣╬╩╣╩╣╠╩╝╠╦║
╚╩╚╣╠╣╬╣╣╠╣╠╬╩╗╩╣╩╠╦╦╣╠╬╗╬╠╦╩╔╠╩╩╦╬╠╠║╗╬╣╬╬╣╩╣╔╣╬╝
╠╩╠╬╩╬╬╔╣═╣╣╩╦╣╦╩╩╠╬╔╩╩═╬╦╦╦╬╠╣╦╬╦╣╦╦╔╣╦╬╝═╠╬╦╠╦╦║
╚╠╣╩╦╦╣╣╣╩╬╣╣╦╣╠╬╬╩╠╠╣╗╔╠╣╩╣╩╣╩╠╣╬╦╬╣╠╬╣╠╠╠╝╔╬╩╣╠║
║╩╬╦╠╠╦╩╠╠╦╦╠╩╣╩╣╩╦╝╦╔║═╩╬═╩═╦╩╬╠╚╣╦╠╩╬╠║╬╔╠╦═╦═║╗
╠═╩╬╩╠╦╦╠╬╦╣╩╦╠╚╬╣╬═╦╬╩╩╠╠╠╦╩║║╣╩╠╬╩╩╠╩╣╩╗╩╩╩╬╝╚╩╣
╠╦╠╬╣╔╣╦╣╣╠╣╩╣╩╣╬╩╔╠═╣╠╦╬╠╩╬╚╩╬╩╬╬╚╬╣╩╚╚╦╩╠╣╝╣╠╣╦╝
╠╩╬║╩╬╗╠╬╬╣╦╣╠╣╣╩╦╩╦╬╣╣╬╦╣╩╦╬╣╠╩╚╔╠╗╦╣╣╬╩╩╦╦╣╣╦╬╠╣
╚╦╩╠╬╩╩╦╗╔╣╠╠╣╠╗╔╠╩╦╠╠╦╬╦╬╩╦╣╠╦╦╦╩╠╩╩╠╬═╚╬╬╣╠╩╬╠╠╝
╠╠╠╬╬╠╬╩╦╬╣╦╩═╠╣╔╦╠╬╩╦╣╦╩╩╬╠╠╦╣╚╦╦╩╣╔═╣╬╩╩╣╝╬╩╬╣╠╣
╔╬╦╣╩╗╠║╦╗╦╦╣╠╣╗╬╦╔╦═╬═╣╩╣╩╬╣╩╦╝═╠╬╠╬╩╩╚╬╠╬╠╦╣╚╣╩╝
╔╦╠╚╣╬╩╠╬╦╠╠║╠╠╬╦╩╩╬═╣╬╠╦╣╦╩╬║╬╦╦╣╩╦╔╠╦╦╗╩═╗╬╣╩╦╦║
╔╗╩╠╩╬╣╬╣╠╣╦╣╩╠╗╩╣╠╬╠╠╩╦╣╦╩╣╗╬╣╦╩╠╬╦╬╩╦╦╩╬╦╩╠╔╣╣╦╝
╠╦╩╗╩╬╣╦╬╦╩╦╦╚╬╔╩╠╬╣╠╬═╦╠╦╦╣╗╣╦╬╩╦╩╬╬╔╣║╠╬╬╠╣╠╠╦╬ 
 ╣╠╠╬╠╦╠╚╣╝╦╣╠╬╩╬╩╠╗╬╦╩╝═╬╦╬╝╬╠╣╠╬╩╩╣╚╦╠╩╦╣╠╩╔╠╚║║
╚╔╬╬╦╠╝╦╣╠╦╠╩╩╠║╩╣╬╠╩╠╣╣╣╗╩╬╬╦╚╝═╬═╔╦╩╬╝╬╠╬╣╦╔╗╣╩╗
╠╣╠║╬╔╩╠╩╦╩╣╣╬╔╬╠╬╣╣╬║╣╚╣╬╝╦╩╣╠╬╠╦╩╬╩╦╦╠╩╦╠╣╦╣╣╚╠╣
╠╬╬╣╩╣╦╣╦╠╠║╦╣╬╣╬╠╚═╔╩╠╬╣╩╩╩╬╚╣╣╠╠╦╬╣╠╦╩═╣╬╬╩║╬╚╬║
║╣╩╩╦╠╣╠╠╩╠╠╬╬╩╬╦╩╬╬╣╬╠╣╬╠╦╝╬╠╚╬╬╔═╩╠╬╬╬╩╠╠╬╬╦╬╬╬╗
╠╬╬╗╣╣╩╠╦═╝╦╬╠╦╬╬╦╬╬╣╠╠╣╦╣╦╣╬╣╦╔╝╬╠╣╦╣═╬╬╬╠╣╠╠╬╬╣╗
╔╦╠╦╦╬╬╬╦╠╠╣╣╬╠╣╦╠╠╣╩╣╣╠╠╔╬╩╣╣╩╠╬╩╗╣╬╠╩╔╩╣╣╔╬╠╬╩╬╗
╚╦╦╣╬╔╩╬╦╣╬╠╠╠╬╣╠╣╦╠╣╬╩╣╬╬═╦╩╬╦╬╩╬╣╦╣╬╠╝╣╬╗╣╣╬╩╬╠╣
╠╬╚╠╠╚═╣╦╦╠╩╦╠╩╝╬╩╣╩╠╣╠╩╬╠╩╦╬╠╣╦╣╦╬╣╠═╬╩╬╬╦╣╦╬╣╦╬╣
╠╔╠╩╣╣╦╠═╬╣╩╩╠╬╩╦╠╦╗╠╦║╠╔╬╝╦╦╗╠╠╝╠╠╣╠╣╣╦╩╩╩╦╦╠╦╣╦╣
╠╣╬╣╬╦╩╦╗╠╬╗╦╦╩╦╦╔╦╦╗╣╦╣╦╠╬╠╬╩╩╠╠╗╩╣╬╩╠╦╠╣╝╩╦╩╣╩╩╝
╠╦╬╬╦╩╠╬╣╠╦╠═╦╣╩╩╠╣╔╦╩╩╣╣╣╣╦╝╬╬╔╬╔╬╣╬╬╠╣╦╬╗╣╝╬╗╩╣║
║╠╬╬╬╦║╠╣╣╠╬╣╣╠╣╦╣╬╩║╣╬╬╚╩╠╩╩╦═╠╣╔╩╣╩╠╦╠╦╠╠╠╠╦╬╣╣╗
╚╣╠╩╩╠╠╣╩╦╦╩╝╠╩╬╩╣╩╠╩╩╩╩╝╬╦╩╚╚╔╦╦╬╩╦═╩╦╦╬╣╩╩╬╬═╬╔╣
╚╬╗╝╩╣╬╦╬╬═╩═╬╩╣╣╦╬╦╣╦╦╦╠╣╬╬╬╩╬╠╠║╬╩╠╬╗╩╬╬╬╩╦╣╩╗╩╣
╔╬║╝╩╬╦╠╩╣╣╦╬╠╦╦╣╣╝╠╚╬╩╩╗╦╦╣╣╠╦╦═╬╩╬╣╩╬╦╬╬╩╬╬╩╦╬╩╣
╠╣╩╠╬╚╠╠╩╬╣╦╣╦╚╩╠╦╩║╣╣╣╚╩╬╬╦╬╦╣╦╠╠╦╩╬╩╣╩╣╠╠╗╦╬╦╩╗╣
╔╣╣╣╬╝╦╠╣╬╬╣╩╠╠╩╠╦╣╠╬╣╦╦╬╣╣╠╦╣╠╬╦╣╔╦╬╬╣╦╩╦╬╩╠╠╠╠╩╣
╔╩╠╩╠╬═╬╬╩╬╔╣╩╬╣╔╠╝╦╩╣╦╬╣╩╦╩╬╩╣╦╠╩╦╣╩╦╩╣╬╬╩╩╣╬╩╩╚╝
╠╣╦╦╩╦╬╣╦╦╣╠╗╣╣╣╠╬╣╣╣╦╩╣╦╬╠╬╩╣╬╬╣╣╬╩╩╠╠╬╦╦╦╣╦╝╠╠╣ 
║╦╗╩╬╣╚╩╠╩╬╠╦╦╩╩╠║╩╬╣╦╩╩╣╦╬╠╠╚╠╠╦╣╦╬╩╣╬╩╬╣╩╠╠╦╠╗╠╣
 ╬╬╦╩╣╣╠╣╠╬╣╩╣╠╬╩╠╩╚╦╣╬╬╦╠╣╩╦╣╬╗╦╬╠╬╣╣╦╗╠╠╔╩╩╠╦╗╝╣
╠║╣╠╦╠╦╦╩╩═╩╦╩╬╣╠╠╩╝╣╩╗╦╩╠╦╦╬╣╠╬╦╬╬╔╚╠╝╩╠╦╠╩╣╩╦╦╬╣
 ╬╬╩╬╩╠╬╩╠╚╦╦╚╩╠╬╝╣╦╦╦╬═╩╠╦╬╣╠╣═╩╣╬╠╦╣╩╦╬╠╦╩║╬╦╚╬╣
╚╣╦╬╣╣║╠╠╠╬╠╠╦╠╬╣╦╦╦╠╣╬╦╦╩╬╦╩╝═╠╠╦╩╦╩╣╠╦╦╩╔╬╩╠╦╬╦╝
╔╠╠╩╬╬╬╬╦╠╬╠╬╩╬╦╩╬╣╩╠╬╬╦╦╣╩╠╦╦╦╗╦╠╠╣╠╔╩╣╠╦╬╔╩╠╬╦╩║
╔╠╬╦╠╬╣╩╔╦╦╣╩╩╣╬╣╠╦╣╦╚╩╩╩╠╩╦╬╦╝╬╬╬║═╦╣╩╚╣╩╩╝╩╬╦╣╠║
╚╬╠╦╩╠╣╠╩╦╩╣╬╬╠╩╠╩╩╦╦╬╦╩╣╩╬╬╦╣╩╦╩╝╬╣╬╝╦═╠╦╬╣╝╣╦╩╣╗
╔╩╣╩╣╣╩═╬╣║╠╔╬╩╣╬╦╩╬╔╬║╩╬╠╩╬╦╠╠╦╬╠╠╦╩╣╣╦═╔╩╬╔╦╦╗╠╗
 ╠╣╬╦╬╠╠╩╠║╬╚╬╬╬╦╣╦╬╣╩╩║╦╝╦╣╣╝╬╝╦╬╬╬╦╦╬╬╩╬╦╠╝╬╦╩╩║
╚╩╬╠╔═╦╦╣╣╩╠╬╣╦╩╦╬╩═╩╠╦╦╬╦╩╦╩╬╬╩╣═╩╦╠║╦╣╣╩╦╣╣═╬╩╠╗
╔╬╦╬╣╦╩╬╣╩╩╚╩╣╬╣╩╦╣╬╩╦╦╣╣╠╦╔╔╠╠╦╔╣╣║╦╬╠╦╣╦╬╠╣╬╠╦╩╗
╚╝╚╩╚ ╝╚╝═╩╚╩╩╩═══╝╝╩╩ ═╚ ═╚ ╝╩═╝═╚╚ ╩╝══╝╩═══╩╚╚█
$ ./maze-solver-spa -s 50x50-09.txt 
Path: SSESEESSSESEESSSWSSSSSSSESSEEESSESSSSEEEESWSWSSSW
  SWSSSEESESENNEESEEENEEEEESENENEEENESESEEESSESESSEESSE
  SSESESSSSENEESENNNENEEESSSSS (with length 130)
═╦╗╦╗═╦╔═╗╦╦╗╗╔╔╔╗═╗╦╔╔═╦╔╔═╗╗╦╗╗═╔╦╦ ╦╔╦╗═╦╦═╦╔ 
╣╗╩╬╬╬╩║╣╦╩╬╦╬╩╗╩╠╠╠╦╣╝╬╩╠╦╦╩╠╔╠╣╠╦╦╩╚╩╬╗╩╦╬╣╦╬╣╣
╠╦╦╠╦╦╣╠╦╠╠╦╩╦╠╠╣╬╣╦╠╦╩╬╠╣╣═╠╦╠╠╩╔╗╠╦╣╣╠╬╩╣╩╣╠╠╣╠╣
╠╩╦╬╬═╬╩╔╣╩╣╠╬╣═╠╬╬╦═╩╠╬╩╩╩║╠╦╣╣╣╠╬═╦╦╬╩═╠╣╬╦╩╩╣╦╝
╠╣╠╩╠╦╩╬╠╠╩╬╦╬║╠╣╩╬═╣╩╦╩╩═╠╬╩╗═╠╬╩╬║╠╚╬╗╣╬╦╦╠╬═╦╝
║╬╚╣╗╩╠╠╔╣╠╩╠╦╬╦╩╣╦╣╣╚╩╠╠╦╬╠╠╣╦╬╬╣╠╣╣╠╠╩╣═╠╣╦╦╣╦╗
╔╠╬╩╦╠╣╩╩╣╚╣╬╣╬╠╦╬╩╗╩╣╣╠╠╣╦╬╠╬╣╦╚╠╩╦╠╠╠╬╠╦╦╦╠╗╠╩╬║
╠╦╩╦╩╦╣╬╣╝╩╠═╬╣╬╬╣╣╬╦╬╔╦╗╩╦╠╦╣╠╦═╗╠╣╠╠╬╬╣╬╬╦╣╬╦╬╦╣
╚╦╬╩║╦╬╩╦╣╠╬║╦╩╦╠╠╣╦╬╦╩╠╦╣╣╣╣╦╠╬╩╩╠╩╦╦╠╬╩╣╩╦╠╠╩╠║
╔╣═╠╬╬╩╦╠╣╠╩╦╠╠╩╬╦╗╦═╦╔╠╠╦╝╣╦╠╣╠╠╦╩╣╗╠╣╠╩╬╬╦╦╔╩╠╝
╠╠╠╬╦╠╩╣╬╣╦╦╠╣╬╠╦╬╣║╠╝╩╠╦╣╬╦╬╦╦╦╔╣╩╩╠╠╣╣╦╣╣╠╣╦╣╬╦╣
║╔═╩╬╬╠╣╬╠╠╣╬╦╩╦╦╬╩╩╠╩╦╣╠╩╣╔╬║╩╣╦╣╠╩╔╩╗╝╣╬╠╦╬╦╣╩╣
╠╦╬╦║╬╠╠╣╬╬╔╗╬╩╝╣╠╠╦╬╬╬╬╠╩╣╣╔╝╩╠╬╗╬╦╣╦╚╣╝╬╦╗╦╩╬║╝
╠╬╩╠╩╦╠╦╩╚╦╩╠╠╔╬╦╦╦═╩╬╦╩╩╦╩╦╬╩╩╬╣╠╩╦╣╔╩╩╬╠╬╬╣╬╣╠╝
╠╦╬╩╣╬╦╩╠╩╩╠╠╠╩╠║╠╦╣╠╦╣╦╠╩╦╝╣╔╗═╣╠╣╣╬╩║╩╬╦╦╠╩╦╬╔╗
╔╣╗╣╩╣╬╣╔╦╣╬╬═╠║╝╣╩╩╣╩╣╬═╦╦╣╦║╣╠╠╣╦╬╗╦╬╠╣╠╠╣╬╬╠║╗
║╬╠╩═╣╩╦╩╣╣╗╠╣╦╩╠╩╩╦╦╦╬╔╩╣╬╩╠╬╣╣╠╚╣╬╦╦╩╣╦╠╠╩╩╩╩╬╝
╚╦╦╦╬╚╦╔╦╬╠╣╦╦╔╬╩╬╩╩╬╣╬╔╦╦╝╩╬╦╣╠╠╠╦╠╠╩╠╬╬╣╠╝╬╦╩╩╠╗
╠╬╦╝╦╦╦╣╠╦╠╔╣╣║╦║╦╣╦╝╝╠╩╠╦╣╦╩╬╣╗╔╦╩╦╩╬╣║╠╩╩╬═╩╠╣╣
╚╣╬║╠║╬╬╬╣╚╬╩╬╚╠═╬╠╣╣╣╣╠╠╠╠╣╩╣╬╩╬╬╩╝═╩╣╬╩╝╩╩╚╠╬╣╠╗
║╬╦╦╣╬╚╦╠║╣╣╩╩╩╠╠╦╠═╩╠╣╦╦╩═╦╦╠╩╩╩╠╬╦╦╚╣╩╦╦╩╬╚╣═╣╣
╠╠╠╩╩╠╩╦╚╬╦╩╩╠╬╦╬═╬╣╩═╦╚╩╬╩╠╠╬╩╠╣╣╝╠╝╠╬╣╠╬╩╝╦╚╠╝╦╣
╠╠╚╠╚╬╩╣╩═╩╝╔╩╠╩╩╬╬╬╩╬╣╠╦╗═╦╦╩╠╠╚╬╩║╣╔╬╝╬╬═╔╩╣╠╩╝
 ╩═╣╣╩╩╣╣╩╣╬╠╩╦═╦╣╬╦╣╦╣╬╠╠╦╠╦╬╠╝╦╦╩╣╣╠╠║╩═╬╠╠╣╦╣╗
╠╠╬╦╬╩╩╠╣╠╠╣╣╣╗╗╩╗═╠╩╔╬╩╠╩╣╣╦═╦╔╣╦╝║╠╦╬╦╣╔╣╬╬╝╩╠╗
╔╦╣╠╣╬╝╦╬╦╩═╦╩╣╦╣╚╣╝╠╬╩╣═╠╠╝╠╩╬╩╬╠╣╠╦║╣╔╩╬╩╣╣╦╦╠╩╝
╚═╠╠╩╗╬╩╠╩╣╣╣╠╩╦╩╣╠╔╔╣╩╣╝╦╩╬╚╠╣╣╬╦╠╚╬╣╣╬╦╗╦╬╦╣╣╦╬║
╠╬╗╣╬╣╦╠╣╚═╬╦╣╣╩╣╬═╠╚╣╝╩╠╗╣╗╬╬╣║╦╠╩╣╩╣╬╦╬╗╠╦╔╦╦╩═║
╠╠╦╣╝╠╩╦╦╩╩╠╦╠╣╠╣╬╦╬═╦╩╠╠╩╠╠╦═╬╦╩╠╠╦╬╩╣╦╬╣╦╩╣╠╬╣╗
╔║╠╔╣╣╩╣╬╦╠╦╬╣║╦╦╣╣╔║╩╩╩╦╠╩╩╣╬╣╬╠╬╩╬╦╦╣╬╝╬╣╩╣╗╠╠╗
╠╣╣╠╦╣╠╩╗╬║╠╩╬╣╦╩╦╔╠╠╠╠╠╠╩╝╦╬╠╠╬╬╠╬═╠╠╩╩╩╩╦╠║╝╩╝╩╝
 ╬╗╠╩╣╦╬╦╠╠╩╩╠╝╩╣╣╩╣╩╩╠╗╬╬╩╩╩╩╩═╩╬╣╣╣╝╠╦║╩╬╩╚╩╬╝╣ 
║╦╦╣╦╦╦╬╩╬╠╩╗╬║╣╦═╦╬╗╦╦╦╬╦╚╣╬╦╝╣╔╠╣╦╣╠╣╠╣╩╣╠╣╬╣╦╣
╠╣╝╩╩╩╣╦╬╠╝╦╩╩╠╬╬╣╦╠╣╩╚╩╦╬╬╩╬╠╣╣╩╬╦╣╣╠╦╩╬╩╗╠╦╬╩╦╣
║╦╣╩╦╠╦║═╦╬╩╣╠╬╣╝╦╠╦╦╩╬╗╦╣╩╬╔╠╬╩═╣╠╦╦╦╣╦╩╠╣╦║╣╩╠╗
╔╦║╠╩╣╦╠║╩╠╬╬╬╠╩╩╩╝╩╠╬╬╠╣╦╗╦╦╩═╦╔╠╣╬╦╩═╦╣╩╦╚╬╬╩║
╔╣╠╣╠╩╣╣╔╩╦╗╦╠╬╠╝╣╦╠╗╣╦╣╠╩╝╠╚╬╬╩╚╦╬╬╬╩╩╝╦╠╠╦╬╬═╦╠╣
╚╦╬╠╠╬╠╝╬╦╠╣╦╦╚╠╗╣╬╬╩╬╠╬╝╦╣╠╠╬╠║╦╣╣╩╦╬╣╠╬╩╬╬╣╣╦╦╬║
╚╣╩╬╬╠╠╩╣╚╩╠╠╬╩╩╚╣╩╝╚╬╠╦╣╩╬╣╬╠╩╝╩╠╩╦╔╦╩╦╬╬╚╩╩╠╦╦ 
╠╬╦╩╣╩╠╠║╦╠╦╦╩╣╩╣╬╬╦╬╗╬╔╬╦╠╩╬╦╬║╣╦╩╔╠╦╬╗╩╠╦╦╦╩╠╩╦║
╚╠╣╣╩╣╣╠╣╠╦╦╣╩╩╗╦╣╣╦═╦╠╠╣╣╬╬╣╦╣╩╬╣╣╦╚╔╩╩╠╬╩╣╠╬╠╗╗
║╦╣╠╩╦╬╬╦╦╠╦╩╣╠╣╣╩╩╠╩╚╬╦╦╬╠╣╠╩╦╦╦╦╠╦╩╬╩╦╣╩╦╬╚╣╩╚╩╣
╚╩╗═╣╦╦╩╦╬╠╬╦═╠╩╬╠╚╬╠╬═╦╠╬╩╬╦╩╦╦╠╣╬╣╣╠╩╩╩╠╠╬╩╠╣╬╝
║╦╦╠╩╣╠╗╬╬╗╣╚╦╝╩╦╩╩╠╣╬╬╦╗╠╠║╣╔╩╬╣╬╣║╬║╩╩╣╠╦╠╔╝╠╣╦╣
╔╩╔╦╣╠╩═╦╣╚╣╠╣╩╠╣╦╩╦╦╠╣╣╣╩╣╬╣╩╬═╬╬╩╣╗╦╔╩╠╣╣═╬╠╠╩╦╗
╔╦╬╬╩╣╩╩╠╗╬╬╦╦╗═╠╣╬╬╬╩╩╦╬╬╣╣╗╦╣╩╝╦╦╦╦╩╦╠╩╣╬╣╠╩╣╣
╔╦╠╦╬╬╦║╠╣╠╦╦╔╠╠╚╬╬╩╠╦═║╠╦╝╩╩╬╣╩╠╦╬╠╠╦╩╣╩╩╠╠╠╩╔
╠╣╣╩╝╩╦╠╠╣╦╩╩╬╠╠╠╠╦╬╠╩╠╬╩╦╬╠╬╣╠═╣╣╠╬╬╦╔╬╩╣╠╩╦║╚╦╠
╠╬╝╬╩╠╦╩╣╩╬╠╦╩╩╠╦╦╝╩╠╬╦║╠║╠╩╠╩╣╦╦╣╩╣╚╔╦╣╬╠╩╩╬╠╬╦
╚═╩═╩╚╚═╩╩═╚╝╩═╩╩╝╝╝═╩╩╚╩═╩╝╚╝╝╩╚ ╚╝═╩═╩╩╩╩╩╩═╚╩═
$ ./maze-solver-spa -s 50x50-10.txt 
No path
█═╔╔╦═ ╔╔╦╗╦═╦╦ ╦╔╔═╦╔══╔╔ ╔╦╔╗═╗╗ ═╗╔╔╗╔╔╔╔╦╗╦╦╦╗
╚╣╩╠╩═╦╔╬╬╦╩╬╝╬╠╠╣╩╬╣╦╦╬╠╦╦╣╦╬╦╬║╣╩╣╠╬║╣╬╣╣╣╦╠╬╔╣╝
╔╦╬╩╣╔╠╬╣╬╝╣╩╣╦╝╠╦╦╣╦╠╣║╣╣╣╩╩╣╠╬╬╠╚╠╩╬╩╔╦╦╠╠╩╚╬╩╠╗
║╩╗╠╣╚╣╦╦╠╦╬╩╝╠╝╬╣╦╩╦╠╝╦╦╣╦╣╩╗╬═╦╩╗╣╣╩╔╦╬╦╬╦╚╣╠╬╠║
╚╗╬╬║╠╣╬═╠╦╣╠╠╣╦╦╩╩╣╩╣╬╩╗╦╠╩╣╦╬╩╩╩╣╠╩╣╗╠╩╬╠╠╩╣╣╩╠╝
╠╬╣╠╠╠╬╣╩╦═╠╩╠╦╦╩╬╩╦╣═╬╩╬╗╦╩╦╬╣╬╣╩╗╚╣╠╠╦╣╩╝╩╩╦╩╩╚╝
 ╚╠╣═╣╠╠╩╠╠╣╔║╠╩╠╬╠╩╣╬╬║╣╩╬╩╬╠╬╬╠╠╚╠╠╣╬╦╣╬╩╩╩╠╬╩╦╝
╠╦╝╩╩╬═╣╚╠╬╣╦╦╦╣╩╬╦╠╠╣╦╝╠╦╬╬╬╬╦╦═╬╬╠║╩╩╣╦╦╬╦╣╠╠╝╦╗
║╩╦╦╬╣╬╩╠╬╩╦╠╝╩╬╩╠═╬╩╠╬╬╩╬╠╚╩╩╠╣╠║╦╠╬╩╩╬═╬╩╬╬╠╦╣╝╣
╠╩╬╝╣╬╬╬╣╩╦╬╗╣╠╠╣╩╣╬╩╦╬╠╠╚╣╠╬╬╩╠╩╝╦╬╩╣╣╝╣╠╩╩╝╦╩╦╬╝
╔╦╬╬╣║╔╣╩╣╩╣╦╦╩╦╦╩╠╬╣╦╬╬╩╦╬╣╩╣╩╬╦╣╩╬╦╠╣╩╔╔╠╩╠╣╬╣╚╗
║╬╦╦╬═╩╣╬╩╣╦╩╦╠╦╬╦╦╣╩╩╦╬═╦╦╝╬╬╩╦╩╬╠╝╚╩╬╣╩╣╩╝╣╦╚╝╬║
╚╩╦╠╬╠╝╣╬╩╬╦╣╣╣╗╬╠╣╦╣╩╣╣╬╣╠╠╝╬╣╚╚╦╦╠╠╩╣╣╠╠╦╬╣╣╬═╦╣
╠╬║╬╚╠╚╬╠╦╦╠╬╬╣╠╣╠╩╦╩╩╩╦╔╣╠╣╩╦╠╣╣╣╩╬╣╠╣╩╦╠╩╠╣╦╩╩║╗
╚╠═╗╠╩╦╩╬╚╬╔╣╬╦╝╣╔╦╬╣╩╩╩╬╦╝╔╦╬╩╦╦╠╝╩╦╣╔╠╣╦╠╣╦╦╩╦╣║
╠╩╬╣╩╬║═╦╬╠╩╔╦╩╣╦╦╩╬╬╠╩╣╦╦╩╣╦╠╩║╦╣╗╠╩╣║║╠╝║╣═╦╦╩╬║
╔╬╠╩╠╦╬╣╦╣╩╦═╬╬╩╗╣╗╬╠╚╠╩╝╣╬╝╝╦╠╦╦╬╠╗╠╦╩╠╩╦╚╦╦╚╠╦╬╗
╠╚╣╩═╦╩╦╣╦╬║╦╦╣╝╬╣╦╬╩╔╗╠╩╩╬╠╠╠╗╬╠╣╬╬╣╣╣╩╩╝╠╬╣╬╦╠╣║
╠╬╬╩╠╩═╬╣╬╩╩╬╠╗╦╩╠╣╩╦═╠╬╦╩╠╣╬╩╩╩═╦╣╦╠╣╩╣╩╠╔╦╦╠╣╬╩║
║╣╬╠╩╩╗╠╣╬╩╠╦║╬╝═╬╦╦╩═╬╝╚╩╬╠╬╦╠╬╣╬╣╣║╣╩╣╣╣╬╗╩═╦║║╝
╚╦╠╣╚╠╣╣╗╔╩╩╦╬╣╬═╣╬║╩╩╣╣╩╩╠╣╩╣╣╩╬╣╩╬╠╩╣╬╣╠╣╬╦╠╣╬╝╗
║╣╔╬╦╬╩╠╚╠╬╝╠╩╩╣╩╠╣╣╣╣╚╔╬╬═╦╠╩╣╬╦╠╣╔╩╣╬╣╩╠╠╩╚╣═╣╠╣
╚╝╣╦╔╦╬╣╩╬║╩╣╬╣╬╣╦╠╦╣╦╠╣╩╠╦╦╩╩╝╩╣╦╣╦╩╦╣╩╩╦╬╩╬╬╠╩╬║
╚╠╩╠╩╣╠╩╩╬╩╣╬╩╗╠╣╩╣╬╣╔╬╬╦╠╩╩╬╣╦╠╣╬╬╬╠║╩╠╦║╦╩╦╣╣═╝║
╔╬╠║╩╦╔╗╩╬╣╔╬╬╠╣╬╠╠╬╬╣╦╬╩╩╦╠╩╦╣╣╣╦╩╠╣╠╔╠╬╩╠╠╣╠╬╩╩╝
╔╦╝╦╬╬╬╣╣╬╠╠╠═╦═╠╣╣╩╦╩╝╦╚╦╦╠╦╠╠╠╣╣╦╬╣╬╦╣╚╠╦╦╠╩╩╩╗╗
╠╬╠╬╬╠╝╬╠╠╦╣╦╣╣╬╩╩╗╩╣╦╬╣╬╝╠╬╣╦╩╠╝╦╬╩╦╦╚╠╦║╗╬╦╣╬╬╣╝
║╦╦╝╦╩╩╦╬╬╩╣╦╩╠╩╣╩╣╩╦╝╣╦╦╩╣╣╩╣╠╠╝╣╦╩╩╩╦╩╚╬╦╩╩╬╣╦╚╣
╔╣╠╦╩╦╠╩╠╦╩╦╬╠╠╠╣╣╩╣╦╗╣╩╩╠╦╬╬╬╠╩╣╔╩══╣╠╦╬╣╦╦╔╦╦╔╬╝
╚╦╝╣╬╦╩║╬╬╣╣╠╝═╚╣╣╩╚╠╦╦╦╠╦╠╩╝╣╣╦╦╠╠╩╣╦╦╣╝╣╣╦╩╠╠╦╣ 
╔║╦╝╚╦╣╩╠╠╬╣╬╦╣╬╠╠╠╚╦╗╩╦╦╦╠╠╩╦╬╠╠╬╣╠╬╦╣╣╬╚╦═╣╦╩╦╠╝
╚╬╦╬╦╗╣╦╩╣╣╩╣╦═╩╚╔╠╩╣╦╠╠╦╩╬╬╣╣╠╬╬╬╔╩╦╝╬╠╣╩═╗╠╬╣╬╔╝
║╠╣╬╣╠╩═╚╦╬╩╠╩╚╩╦╔╣╩╣╠╬╣╠╠╬╦╦═╣╬╣╝╣╦╩╩╠╣╣╬╣╩╩╦╬╩╣╣
╚╬╝╦╦╔╝╬╬╣╠╠╩╬╬╠╠╣╚╝╣║╬╩╠═╣╬╬╦═║╬╬╦╦╬╦╬╦╩╬╬╦╠═╩╦╦║
 ╬╣╩╦╦╣╣╬╝╬╣╦╩╬╩╩╣╠╣╦╣╩╣╦╠╦╠║╠╦╣╦╬╬╩╬╚╩╣╬╚╩╦╣╩╠╩╔╗
╠╩╦╣╦║╣╣╚╣╝═╠╠╠╬╠╦╣╩╣╗╬╩╩╦╣╦╩╦╦╠╬╩═╬╦╝╬╣╣╦╦╣╬╦╦╩╦ 
╠╬╠╠╬╠╠╗╠╩╣╠╣╬╔╦╬╦╣╩╔╩╬╠╦╦╠╣╠═╬╩╣╦╩╦╦╩╦╩╣╣╗╣╩╠╣═╦╣
╚╦╠╣║╩╠║╩═╠╦╦╩╦╬╩═╦╦╣╠╣╦╦╩╝╦╬╣╚╬╔╦╬╩╬╣╣╔╦╦║╚╠╦╬╩╚╝
║╚╬╩╣╣╣╗╣╬╦╩╠╠╝╦║╠╩╩╣╠╗╬╦╦╩╬╠╩╦╦╝╗╩╦╩╦╣╣╠╠╬╦╩╠╬╩╩╣
╠╩╬╣╬╩╠╦╠╩╬╩╩╩╠╩╬╩╩╣╬╣╬╣╬╣╩╠╩╩╣╝╩╠╬╗╬╩╣╦╗╠╣╦╬╣╣╬╣╣
╔╩╬═╠╩╩╗╦╩╣╩╦╩╬╠╚╬╩╩═╩╬╩╣╠╠╩╣╣╠╦╝╩╔╬╬╩╣╚╠╔╠╝╬╠╣╚╩╝
╚╩╬╠╩╦╦╩╬╣╬╩╦╬╠╩╠╩╠╬╣╣╣╩╬╬╦╝╦╦╣╠╠╦╠╠╩╩╬╠╬╣╣╠╩╬╩╦╬╝
╠╦╣╣╬╩╔╔╠╠╦╬╦╦╬║╠╠╩╩╬╩╠╠╠╠╠╠╦╠╩╠═╣║╝╦╬╬╬╣╩╗╩╣╬╦╗╣╗
 ║╬╣╬╩╬╦╩╬║╩╩╣╬╬╩╬║╬╬╬╔╠╩╬╝╩╬╠╚╩║╬╠╠╣╠╠║╠╩╠╣╩╗╬╠╚║
║╠╔╠╩╬╬╔╦╗╣╩║╬╬═╬╣╣╦╗╩╩╠╦╩╠╠╠╦╣╠╩╩╠╬╠╩╠╣║╩╬╦╦╣╩╣╝╝
╚╣╬╦╠╠╠╣╠║╩╗╠╦╬╦╠╬╩╝╣╠╚╬╚╬═╬╝╬╦╦╣╣╦╬╣╣╦╬╩╦╬╦╝╔╩╠╦╣
╚╩╦╚╦╦╬╬╠╣╣╦╝╠╣╝╣╬═╣╦╠╩╩╔╠╦╩╩╩╔╬═╠╣╣╦╠╠╗╠╩╩╩╩═╦╣╠╝
╔╦╣╣╠╠╗╗╣╦╩╩╠╠╩╦╠╬╦╩╣╦╬╬╚╣╬╩╗╩╣║╦╚╩╬╦╔╠╦╬║╦═╣╠╣╦╬╣
║╣╣╝╣╦═╦═╦║╣╔╩╦╩╣╬╣╣╩║╠╠╬╬╬╦╣╩╔╦╦║╣╩╩╩╠╦╩╦╣╩╠╩╦╩╣╣
╚╝╩═╝╚╚╝═╝═╝═╩╩╩╚╩╩╝╝╩═╚╩╩╝╝╚ ╩╩╝╩╚ ╝═╩═╩╩╩╩╩╩╩╚╝█

An Observation

An untraversable maze is more often than not broken near the entry or exit (than somewhere in the middle). This is especially true for large mazes (and thus not so true for small mazes). The reson should be quite obvious...

Part 3: The Wall

See the next part; Part 3: The Wall for a completely different approach to traversing a maze. An approach that we can actually use «on site», if we happen to come across a physical maze...