0% found this document useful (0 votes)
57 views

Program 4

This program implements a maze traversal algorithm using queues and dynamically allocated arrays. It reads a maze from a file, stores the maze in a 2D array within a maze struct. It then solves the maze using a queue-based algorithm, marking the path and occasionally printing the maze state. Key functions include readMaze() to input the maze, navMaze() to perform the traversal algorithm, and printMaze() to output the maze. The queue class implements enqueue, dequeue, and checking for duplicates to track the path through the maze.

Uploaded by

api-709999921
Copyright
© © All Rights Reserved
Available Formats
Download as PDF, TXT or read online on Scribd
0% found this document useful (0 votes)
57 views

Program 4

This program implements a maze traversal algorithm using queues and dynamically allocated arrays. It reads a maze from a file, stores the maze in a 2D array within a maze struct. It then solves the maze using a queue-based algorithm, marking the path and occasionally printing the maze state. Key functions include readMaze() to input the maze, navMaze() to perform the traversal algorithm, and printMaze() to output the maze. The queue class implements enqueue, dequeue, and checking for duplicates to track the path through the maze.

Uploaded by

api-709999921
Copyright
© © All Rights Reserved
Available Formats
Download as PDF, TXT or read online on Scribd
You are on page 1/ 25

Erik Cooley

CS 121: Program 4
3.29.2023
Queues

Design:
Introduction:
This program aims to implement a maze traversal program using dynamic arrays and
queues. The information for the maze will be stored in a dynamically allocated array of
characters, while the path through the maze will be created using a queue.
Data Structures:
1) A queue data structure will be used for the maze traversal algorithm, as outlined below.
This queue will store a struct named data with three values: two integers and a character.
The integers will represent maze coordinates and the character will be used to determine
what character to mark a visited cell with: ‘<’, ‘>’, ‘^’, or ‘v’, to indicate the direction of
the path through the maze.
2) Dynamically allocated arrays will be used for the storage of the maze. This program will
be designed to traverse through two-dimensional mazes, so these arrays will likewise be
two-dimensional.
3) A struct containing values for the width and height of the maze as well as the maze array
will likely be needed to pass information around the various functions. The name of this
struct will be maze.
Functions:
1) maze readMaze()
This function will ask the user for the name of the file to be read and will store the content of
that file in a two-dimensional array. The function will also store the values for the width and
height of the maze. The array pointer and these values will be put into a maze struct, which
the function will return.
2) void printMaze( maze )
This function will be used within the navMaze function to output the maze at certain
intervals. It will take the maze struct as input and will print the contents of the two-
dimensional array stored therein.
3) void navMaze ( maze )
This function will take a maze as input and will perform the maze-solving algorithm outlined
below:
• Start at the cell containing the ‘S’ character.
• If the current cell is next to the ‘G’ cell, quit.
• Mark the current cell as visited. This marking will be done with the character stored
in the dequeued cell struct.
• Add all unvisited neighbors to the queue. The character enqueued with that
neighbor’s coordinates will be determined by the neighbor’s position relative to the
current position.
• Remove the next element from the queue and make it the current cell.
The printMaze function will be used at certain intervals (determined by the maze’s size) to
output the state of the maze navigation procedure.
Time Estimate:
I estimate this program will take me five hours: two hours for the creating and testing of a
workable queue class, two hours for the maze functions, and one hour for testing and debugging.
Programming Log:
Total time spent: 6.5 hours.
• 3.29.2023
Wrote my programming design, which took about an hour.
• 3.30.2023:
Created a queue class with constructor, enqueue, dequeue, and print functions. Took me around
two hours.
• 4.1.2023:
Began working on the user input function. I forgot how reading a file works so it took me longer
than it should have. I used this opportunity to look over file reading protocol, which was a
positive learning experience. I was able to finish the function and test it in one hour.
• 4.2.2023:
Completed the printMaze function and the navMaze function. I ran into an issue during testing
where an item would be enqueued multiple times, which for the larger mazes significantly
increased the number of steps taken to solve the maze. This issue also messed with the printing
of the maze at regular intervals, as cells would be dequeued which had already been visited,
meaning multiple steps were taken on one cell. I created an isInQueue() function for my queue
class which takes x and y values as parameters to see if they have already been enqueued. The
navMaze function then checks this function before enqueuing a cell. This fixed the problem.
Overall, spent two and a half hours on this today. The program is now functional.
Source Code:
1. queue.h
/*
* queue.h
*/

#ifndef QUEUE_H
#define QUEUE_H

// data structure to store coordinates and a character


struct data {
int x;
int y;
char v;
};

class Queue {
private:
struct node {
data info;
node * next;
};
typedef node * nodeptr;
nodeptr head;
int size;
public:
Queue(); // constructor
void enqueue( int, int, char ); // add item to queue
data dequeue(); // remove item from queue
bool isInQueue( int, int ); // is item in queue?
void print(); // print queue
};

#endif

2. queue.cpp
/*
* queue.cpp
*/

#include "queue.h"
#include <iostream>
using namespace std;

/*------constructor------*/
Queue::Queue() {
head = NULL;
}

/*-------add node to queue-----*/


void Queue::enqueue( int x, int y, char v ) {
nodeptr n = new node;
n -> info.x = x;
n -> info.y = y;
n -> info.v = v;
n -> next = NULL;
nodeptr h = head;

if (head != NULL) {
while (h -> next != NULL) {
h = h -> next;
}
h -> next = n;
} else {
head = n;
}

size++;
}

/*---------remove node from queue, return its contents--------*/


data Queue::dequeue() {
data d;
if (head != NULL) {
nodeptr h = head;
head = head -> next;
h -> next = NULL;
d.x = h -> info.x;
d.y = h -> info.y;
d.v = h -> info.v;
h = NULL;
delete h;
size--;
}
return d;
}

/*-------print queue--------*/
void Queue::print() {
nodeptr h = head;
cout << "printing queue:\n";
while ( h != NULL ) {
cout << "(" << h -> info.x << ", " << h ->info.y;
cout << ", " << h -> info.v << ") " << endl;
h = h -> next;
}
}

/*-----determine if item with some x and y is already in queue------*/


bool Queue::isInQueue( int x, int y ) {
nodeptr h = head;
bool r = false;
while (h != NULL) {
if (h -> info.x == x && h -> info.y == y) {
r = true;
}
h = h -> next;
}
return r;
}

3. mazeTraversal.cpp
/* mazeTraversal.cpp
*
* CS 121.Bolden...........g++ on Ubuntu 9.3.0............Erik Cooley
* 4.4.2023....HP, Intel CORE i5 7th [email protected]
*
* Program processes a maze text file,
* solves the maze using an algorithm,
* and outputs several representations of the maze along the way.
* -----------------------------------------------------------------
*/
#include <iostream>
#include <fstream>
#include <string>
#include <algorithm>
#include "queue.h"
using namespace std;

/*--------maze structure to pass mazes between functions--------*/


struct maze {
char ** grid; // maze array
int width; // width of maze
int height; // height of maze
};

maze readMaze();

void navMaze( maze );

void printMaze( maze );

int main() {
navMaze(readMaze());
}

/*----------creates maze struct from file name input----------*/


maze readMaze() {
// get file name from user
string name;
cout << "enter maze file name: ";
cin >> name;
name += ".txt";
ifstream ifile;
ifile.open(name.c_str());

// initialize maze struct


maze m;

// read values
ifile >> m.width;
ifile >> m.height;

m.grid = new char*[m.width];

for (int i = 0; i < m.width; i++) {


m.grid[i] = new char[m.height];
}

for (int i = 0; i < m.height; i++) {


for (int j = 0; j < m.width; j++) {
ifile >> m.grid[j][i];
}
}

ifile.close();

return m;
}

/*---------prints a maze---------*/
void printMaze( maze m ) {
int width = m.width;
int height = m.height;
char ** grid = m.grid;

for (int i = 0; i < height; i++) {


for (int j = 0; j < width; j++) {
cout << grid[j][i] << " ";
}
cout << endl;
}
}

/*---------maze-solving algorithm--------*/
void navMaze( maze m ) {
Queue q; // queue for algorithm
int width = m.width;
int height = m.height;
char ** grid = m.grid;
int x; // cell position x
int y; // cell position y
// data struct defined in queue.h
// container for dequeued information
data d;

// how often to print maze


int interval = width*height/6;

// set x and y to starting position


for (int i = 0; i < width; i++) {
for (int j = 0; j < height; j++) {
if (grid[i][j] == 'S') {
x = i;
y = j;
}
}
}

bool quit = false; // regulates loop below


char v = 'S'; // what character to set current cell to
int steps = 0; // loop iteration counter
while (!quit) {
// set current cell to direction indicator
grid[x][y] = v;

// for each direction:


// check for unvisited neighbor cells,
// enqueue them if not already enqueued.
// if adjacent cell is goal, set quit to true.

// north
if (y-1 >= 0 && (grid[x][y-1] == '.' || grid[x][y-1] == 'G')) {
if (grid[x][y-1] == 'G') {
quit = true;
}
if (!q.isInQueue(x, y-1)) {
q.enqueue(x, y-1, '^');
}
}
// east
if (x+1 < width && (grid[x+1][y] == '.' || grid[x+1][y] == 'G'))
{
if (grid[x+1][y] == 'G') {
quit = true;
}
if (!q.isInQueue(x+1, y)) {
q.enqueue(x+1, y, '>');
}
}
// south
if(y+1 < height && (grid[x][y+1] == '.' || grid[x][y+1] == 'G'))
{
if (grid[x][y+1] == 'G') {
quit = true;
}
if (!q.isInQueue(x, y+1)) {
q.enqueue(x, y+1, 'v');
}
}
// west
if (x-1 >= 0 && (grid[x-1][y] == '.' || grid[x-1][y] == 'G')) {
if (grid[x-1][y] == 'G') {
quit = true;
}
if (!q.isInQueue(x-1, y)) {
q.enqueue(x-1, y, '<');
}
}

// dequeue cell, set x, y, and v for next iteration


d = q.dequeue();
x = d.x;
y = d.y;
v = d.v;

// print maze at reasonable intervals and at start and end


if ((steps % interval) == 0 || quit == true) {
cout << "----------------------------------" << endl;
printMaze(m);
cout << "----------------------------------" << endl;
}
// increment step counter
steps++;
}
}
Output:
Erik Cooley | 4.4.2023 | mazeTraversal

5 x 5 Maze:
$ ./mazeTraversal
enter maze file name: maze
----------------------------------
S . . . .
. # # . #
. # . . .
. # . # .
. . . # G
----------------------------------
----------------------------------
S > > . .
v # # . #
v # . . .
. # . # .
. . . # G
----------------------------------
----------------------------------
S > > > >
v # # v #
v # . . .
v # . # .
. . . # G
----------------------------------
----------------------------------
S > > > >
v # # v #
v # . v >
v # . # .
v > . # G
----------------------------------
----------------------------------
S > > > >
v # # v #
v # < v >
v # . # v
v > > # G
----------------------------------

10 x 10 Maze:
$ ./mazeTraversal
enter maze file name: maze1
----------------------------------
S # # . # # . # # .
. . . . . . . . . .
# . . . # # # # . #
. # . # . . . # . #
. . . # . # . . . .
. # . # # # . # # .
. # . # . . . # # #
. # . # . # # . . .
. . . . . . . . # .
# # . . # # . # # G
----------------------------------
----------------------------------
S # # ^ # # ^ # # .
v > > > > > > . . .
# v v v # # # # . #
. # v # . . . # . #
. < v # . # . . . .
. # v # # # . # # .
. # . # . . . # # #
. # . # . # # . . .
. . . . . . . . # .
# # . . # # . # # G
----------------------------------
----------------------------------
S # # ^ # # ^ # # ^
v > > > > > > > > >
# v v v # # # # v #
^ # v # . . . # v #
< < v # . # . . . .
v # v # # # . # # .
v # v # . . . # # #
. # v # . # # . . .
. < v > . . . . # .
# # v . # # . # # G
----------------------------------
----------------------------------
S # # ^ # # ^ # # ^
v > > > > > > > > >
# v v v # # # # v #
^ # v # . . ^ # v #
< < v # . # < < v >
v # v # # # v # # v
v # v # ^ > . # # #
v # v # ^ # # . . .
< < v > > > > . # .
# # v v # # . # # G
----------------------------------
----------------------------------
S # # ^ # # ^ # # ^
v > > > > > > > > >
# v v v # # # # v #
^ # v # < < ^ # v #
< < v # v # < < v >
v # v # # # v # # v
v # v # ^ > v # # #
v # v # ^ # # ^ > >
< < v > > > > > # v
# # v v # # v # # G
----------------------------------

20 x 20 Maze:
$ ./mazeTraversal
enter maze file name: maze2
----------------------------------
. . . . # # # . . # # # # # . . # . . S
. # # . . . # . . . . # . . . . . . # .
. . . . # . . . # . # . . # . # # # . .
# # . . . . . # # . . . # # . # # # # .
# . . # # . # . . . # . . . . . # . . .
. . # # # . . . . . . # . # # . . . . #
. . # # # . # # . . # . # # . . # . . #
# . . . . . . . # . # # . . . . . . . .
# . . . # # # . . . . # . # . # # # . .
. . # . . . # . # . . . . # # . . . # .
. # # . . # . . # . . # . . # # # . # .
. # . . . # . # . # . . . . . . . . . .
. . # # . # . . # # # # # . # # . # # .
. # . . . . . . . # # # # . . # # # . .
. . . . # # # # . # . . . . # . . . # .
# # . # . # . . . . # # . . . # # # . .
. # . . . . . # . # . # . . . . . . . #
. # . # # . . # . . . . . # . # # # . #
. . . . # . . # # . # # # . . . # # . #
# . . . # . . . . G # # # # # . . . . #
----------------------------------
----------------------------------
. . . . # # # . . # # # # # < ^ # < < S
. # # . . . # . . ^ . # < < < < < v # v
. . . . # . . . # ^ # < v # v # # # < v
# # . . . . . # # < < v # # v # # # # v
# . . # # . # . < v # < < < v ^ # < < v
. . # # # . . . . v . # v # # < < < v #
. . # # # . # # . . # . # # < v # < v #
# . . . . . . . # . # # < < < < < < v >
# . . . # # # . . . . # v # v # # # v v
. . # . . . # . # . . . . # # . . . # v
. # # . . # . . # . . # . . # # # ^ # v
. # . . . # . # . # . . . . . . < < < v
. . # # . # . . # # # # # . # # . # # v
. # . . . . . . . # # # # . . # # # < v
. . . . # # # # . # . . . . # . . . # v
# # . # . # . . . . # # . . . # # # . .
. # . . . . . # . # . # . . . . . . . #
. # . # # . . # . . . . . # . # # # . #
. . . . # . . # # . # # # . . . # # . #
# . . . # . . . . G # # # # # . . . . #
----------------------------------
----------------------------------
. . . . # # # < ^ # # # # # < ^ # < < S
. # # . < ^ # < < ^ > # < < < < < v # v
. . . . # < < v # ^ # < v # v # # # < v
# # . . < < v # # < < v # # v # # # # v
# . . # # ^ # < < v # < < < v ^ # < < v
. . # # # < < < < v > # v # # < < < v #
. . # # # v # # < v # . # # < v # < v #
# . . . < v < ^ # v # # < < < < < < v >
# . . . # # # < < v ^ # v # v # # # v v
. . # . . . # v # < < < v # # < < ^ # v
. # # . . # . v # < v # v > # # # ^ # v
. # . . . # . # . # < < v < < < < < < v
. . # # . # . . # # # # # v # # v # # v
. # . . . . . . . # # # # v > # # # < v
. . . . # # # # . # . . . v # . . . # v
# # . # . # . . . . # # . . . # # # < v
. # . . . . . # . # . # . . . < < < v #
. # . # # . . # . . . . . # . # # # v #
. . . . # . . # # . # # # . . . # # v #
# . . . # . . . . G # # # # # . . < v #
----------------------------------
----------------------------------
< < < ^ # # # < ^ # # # # # < ^ # < < S
^ # # < < ^ # < < ^ > # < < < < < v # v
< < < ^ # < < v # ^ # < v # v # # # < v
# # < < < < v # # < < v # # v # # # # v
# < v # # ^ # < < v # < < < v ^ # < < v
< v # # # < < < < v > # v # # < < < v #
< ^ # # # v # # < v # . # # < v # < v #
# < < < < v < ^ # v # # < < < < < < v >
# < < v # # # < < v ^ # v # v # # # v v
< v # v > > # v # < < < v # # < < ^ # v
. # # v v # < v # < v # v > # # # ^ # v
. # < v v # v # . # < < v < < < < < < v
. . # # ^ # v > # # # # # v # # v # # v
. # . < < < v v > # # # # v > # # # < v
. . . . # # # # v # < < < v # . . . # v
# # . # . # . . . . # # < v ^ # # # < v
. # . . . . . # . # ^ # < < < < < < v #
. # . # # . . # . < < < v # v # # # v #
. . . . # . . # # . # # # < v ^ # # v #
# . . . # . . . . G # # # # # < < < v #
----------------------------------
----------------------------------
< < < ^ # # # < ^ # # # # # < ^ # < < S
^ # # < < ^ # < < ^ > # < < < < < v # v
< < < ^ # < < v # ^ # < v # v # # # < v
# # < < < < v # # < < v # # v # # # # v
# < v # # ^ # < < v # < < < v ^ # < < v
< v # # # < < < < v > # v # # < < < v #
< ^ # # # v # # < v # . # # < v # < v #
# < < < < v < ^ # v # # < < < < < < v >
# < < v # # # < < v ^ # v # v # # # v v
< v # v > > # v # < < < v # # < < ^ # v
v # # v v # < v # < v # v > # # # ^ # v
. # < v v # v # . # < < v < < < < < < v
. . # # ^ # v > # # # # # v # # v # # v
. # . < < < v v > # # # # v > # # # < v
. . . . # # # # v # < < < v # . . . # v
# # . # . # . . . . # # < v ^ # # # < v
. # . . . . . # . # ^ # < < < < < < v #
. # . # # . . # . < < < v # v # # # v #
. . . . # . . # # v # # # < v ^ # # v #
# . . . # . . . . G # # # # # < < < v #
40 x 40 Maze:
$ ./mazeTraversal

enter maze file name: maze3

----------------------------------

# # # . . . . . . # # . . . . . # # S . . . # . . . . # . . . S . . . . # . . .

. . . . # # # # . . . # # # . # # . # # . # . . # # . . . # # # # # # . . . # .

. # . . . . # . . . . . . # # . . . . . . . # . . . . . # # . . . . # . # # # .

. . # . . . . . . # # . . . . . # # . . # . . . # . . # . . # # . # # # # # # .

. # . . . . . # # . . # . . # . . . # # # # . # # # . # # # . . . . # # # # . .

. . # . . # . # # . # . # . . # # . . . . . # # . . . . . # # . # . # # # # . #

. # . . . # . . . . . # . # # . # # # # # . . . . # # # . . . . . # . . . . . #

. . . . # . # # . # . . # . # # . . # . # # # . . . # # . . # # . . . . # # # #

. # # # . . # . . . . # . . . # . # . # . # . . # . # # # # . . . . . . . # # #

. . # # # . # . # # . . # . . . # . # # . # # . # # # # # . . . . # # . # # # .

# . . . . . . # # # . # . . # # . . # # . . . . # # . # # # # # . . # # # . # .

. # # # . # # . . # . # . # # . # . . # . . . . . . . . # # . . . . . # . # . .

. # # # . # # . . . . . . . # . . # . # # # . . # # # # # # . # # # . . . . # .

. . # # . # . # . . . # # . . # # # # . # # # . . . . # # # . # # # # . # . . #

# # . . . # # # . . . . . . . # # # . . # # # . # # . # # # . # # . . # . # # .

. . # # . . . # # # . # # . . . # . . # # . . . . . . # # # # # # # # . . # # .

. # # # . # # . . # . . # # . . # . # . . . . . # . . . # # . # . . # . . . . .

. . . . . # . . # . # # . # # . . . . # # . # # . # # # # # . # # # . # # . . #

# # # # . . . . # # . . # # # . # . . . . . # # # . . # # . . . . . . # # # # .

. . # . . . . # . . # . # . . . # # . # # . # # . # # . . . . # # # . . . # . .

. . . . # # . . . . . # . . # # . # . . # . # . . # # . # # # . . . # # # . # .

. # # # . . . # # . # . . # # . . # # . . . . . . . . # . . . # . . # . . # # .

. . # . # . . . # . # # . # # . # . . # . . # . . # . . . # . . # . . # . # . #

. # # # . # # . . . . . . . # . . . # . . # . . # # # # . . # . # # . # # # # .

. . # # # . . . . # . . # # . # . . . . # # . . # # # # . . . # . . # # # . . #

. # # . . # # # . . # # # # # . # . # . . . # . . # # . . . . . . . . # . . # .

. # . # # . . . . # . . # # . . . # . . # # . # . . . . . # . . . # . . # # # .

. . # . # # # . . . # . . . # . . . . . . # # # . # # . # . # . . . # . # . . .

. # # # . # # . # . . # . # # . # . . # # . . # # # . . . . # . . # . . . # # #

. # # . # # . # . # . . # . . # . . . # # . # . . # . . . # # # # . # # . . . .

. # # # # . # . # # . . . # # . # # . . . # . # . . . # . # # . . # # # . # # .
# . # . . # . . # . # # . . . # # . . # # . # . . . # # # . # # # . # . # # . .

. . . # . . # # # # . . . # . . . . . . . # . # . . . # # # . # . . . . # . . .

. # # . . . . # # . # # . . # . # # # . # # # . # . # . . . # # # # . # . . . #

. . . # # . . . # # . . . # . . . # . . . . . # . . # # . . # # . . . # . . # #

# # . . . . . . # . # # . . . # # # . . # . . . . # . . . # # # # # # . # . . .

. . . . . # # . . . . . . . . # # . . # . # # . . . . # . . . # . . . . . # # .

. # # . . # # . # . . # . . # # # # # # # # . # . # # # # # # # # # # # . . . .

. # . # . # . . . . # # . . . # # . . . . . # # . . . . # # # # . . . . . # # .

G . . . # # # . # # # . . . . . . . . # # # # # # . . . . . . . . # # # # # # #

----------------------------------

----------------------------------

# # # < < < < < ^ # # . . . . . # # S < ^ > # < < < ^ # < < < S > > > > # ^ > >

. . . v # # # # < < ^ # # # . # # ^ # # ^ # < ^ # # < < v # # # # # # v > > # v

. # . < < ^ # < < < < < ^ # # < < < < < < ^ # < < < < v # # < < ^ > # v # # # v

. . # < < < < < v # # < < < < v # # < v # < < v # < v # . . # # ^ # # # # # # v

. # . < < < v # # . . # < v # v < ^ # # # # v # # # v # # # < ^ > > # # # # < v

. . # . v # v # # . # . # v > # # < < < < ^ # # < < v > > # # ^ # v # # # # v #

. # . . . # v > > . . # . # # . # # # # # < < < v # # # v > > > > # < < < < v #

. . . . # . # # . # . . # . # # . . # . # # # < v > # # v v # # v > > v # # # #

. # # # . . # . . . . # . . . # . # . # ^ # < v # v # # # # < < v v v v > # # #

. . # # # . # . # # . . # . . . # . # # ^ # # v # # # # # < < < v # # v # # # .

# . . . . . . # # # . # . . # # . . # # < < < v # # ^ # # # # # v > # # # . # .

. # # # . # # . . # . # . # # . # . . # < < < v > > > > # # < < v v > # ^ # . .

. # # # . # # . . . . . . . # . . # . # # # < v # # # # # # v # # # v > > > # .

. . # # . # . # . . . # # . . # # # # . # # # v > > > # # # v # # # # v # v > #

# # . . . # # # . . . . . . . # # # ^ . # # # v # # v # # # v # # . . # . # # .

. . # # . . . # # # . # # . . ^ # ^ > # # < < v > > v # # # # # # # # . . # # .

. # # # . # # . . # . . # # < ^ # ^ # < < < < v # v v > # # . # . . # . . . . .

. . . . . # . . # . # # . # # < < < ^ # # v # # . # # # # # . # # # . # # . . #

# # # # . . . . # # . . # # # v # < < < < v # # # . . # # . . . . . . # # # # .

. . # . . . . # . . # . # . . v # # v # # v # # ^ # # . . . . # # # . . . # . .

. . . . # # . . . . . # . . # # . # v ^ # v # ^ > # # . # # # . . . # # # . # .

. # # # . . . # # . # . . # # . . # # < < v > > > > > # . . . # . . # . . # # .

. . # . # . . . # . # # . # # . # . . # < v # v v # v . . # . . # . . # . # . #

. # # # . # # . . . . . . . # . . . # < v # < v # # # # . . # . # # . # # # # .

. . # # # . . . . # . . # # . # . . < v # # < v # # # # . . . # . . # # # . . #
. # # . . # # # . . # # # # # . # . # v . . # v . # # . . . . . . . . # . . # .

. # . # # . . . . # . . # # . . . # . . # # . # . . . . . # . . . # . . # # # .

. . # . # # # . . . # . . . # . . . . . . # # # . # # . # . # . . . # . # . . .

. # # # . # # . # . . # . # # . # . . # # . . # # # . . . . # . . # . . . # # #

. # # . # # . # . # . . # . . # . . . # # . # . . # . . . # # # # . # # . . . .

. # # # # . # . # # . . . # # . # # . . . # . # . . . # . # # . . # # # . # # .

# . # . . # . . # . # # . . . # # . . # # . # . . . # # # . # # # . # . # # . .

. . . # . . # # # # . . . # . . . . . . . # . # . . . # # # . # . . . . # . . .

. # # . . . . # # . # # . . # . # # # . # # # . # . # . . . # # # # . # . . . #

. . . # # . . . # # . . . # . . . # . . . . . # . . # # . . # # . . . # . . # #

# # . . . . . . # . # # . . . # # # . . # . . . . # . . . # # # # # # . # . . .

. . . . . # # . . . . . . . . # # . . # . # # . . . . # . . . # . . . . . # # .

. # # . . # # . # . . # . . # # # # # # # # . # . # # # # # # # # # # # . . . .

. # . # . # . . . . # # . . . # # . . . . . # # . . . . # # # # . . . . . # # .

G . . . # # # . # # # . . . . . . . . # # # # # # . . . . . . . . # # # # # # #

----------------------------------

----------------------------------

# # # < < < < < ^ # # . . . . . # # S < ^ > # < < < ^ # < < < S > > > > # ^ > >

< < < v # # # # < < ^ # # # . # # ^ # # ^ # < ^ # # < < v # # # # # # v > > # v

v # < < < ^ # < < < < < ^ # # < < < < < < ^ # < < < < v # # < < ^ > # v # # # v

v > # < < < < < v # # < < < < v # # < v # < < v # < v # . . # # ^ # # # # # # v

v # < < < < v # # ^ > # < v # v < ^ # # # # v # # # v # # # < ^ > > # # # # < v

v > # < v # v # # ^ # . # v > # # < < < < ^ # # < < v > > # # ^ # v # # # # v #

^ # < < v # v > > > > # . # # . # # # # # < < < v # # # v > > > > # < < < < v #

< < < v # . # # v # v > # ^ # # . . # . # # # < v > # # v v # # v > > v # # # #

v # # # . ^ # < v > v # < ^ > # . # . # ^ # < v # v # # # # < < v v v v > # # #

v > # # # ^ # v # # v > # ^ > > # . # # ^ # # v # # # # # < < < v # # v # # # .

# v > > > > > # # # v # ^ > # # . . # # < < < v # # ^ # # # # # v > # # # . # .

. # # # v # # < ^ # v # ^ # # . # . . # < < < v > > > > # # < < v v > # ^ # . .

. # # # v # # < < < < < < ^ # . . # . # # # < v # # # # # # v # # # v > > > # .

. . # # v # . # < < ^ # # < ^ # # # # ^ # # # v > > > # # # v # # # # v # v > #

# # . . . # # # < < < < < < ^ # # # ^ > # # # v # # v # # # v # # . . # . # # .

. . # # . . . # # # v # # < < ^ # ^ > # # < < v > > v # # # # # # # # . . # # .

. # # # . # # . . # v > # # < ^ # ^ # < < < < v # v v > # # . # . . # . . . . .

. . . . . # . . # . # # . # # < < < ^ # # v # # . # # # # # . # # # . # # . . #

# # # # . . . . # # . . # # # v # < < < < v # # # . . # # . . . . . . # # # # .


. . # . . . . # < ^ # . # < < v # # v # # v # # ^ # # . . . . # # # . . . # . .

. . . . # # < < < ^ > # < v # # ^ # v ^ # v # ^ > # # . # # # . . . # # # . # .

. # # # . . ^ # # ^ # < v # # ^ > # # < < v > > > > > # ^ > > # . . # . . # # .

. . # . # < < ^ # ^ # # v # # ^ # ^ > # < v # v v # v > > # v > # . . # . # . #

. # # # . # # < < < < < v > # < < ^ # < v # < v # # # # v > # v # # . # # # # .

. . # # # < < < v # < v # # . # < < < v # # < v # # # # v v > # ^ > # # # . . #

. # # . . # # # v > # # # # # ^ # v # v > > # v > # # < v v v > > > > # . . # .

. # . # # . . < v # . . # # < < ^ # < v # # . # v > > > v # v v v # v > # # # .

. . # . # # # < v > # . . . # < < < < v > # # # v # # v # ^ # v v > # v # . . .

. # # # . # # . # . . # . # # v # < v # # . . # # # < v > > # v v # < v > # # #

. # # . # # . # . # . . # . . # < < v # # . # < ^ # < v v # # # # . # # . . . .

. # # # # . # . # # . . ^ # # . # # v > > # . # < < v # v # # . . # # # . # # .

# . # . . # . . # . # # < < ^ # # < v # # . # < < v # # # . # # # . # . # # . .

. . . # . . # # # # . . v # < < < < v > > # . # < v > # # # . # . . . . # . . .

. # # . . . . # # . # # . . # v # # # v # # # . # v # . . . # # # # . # . . . #

. . . # # . . . # # . . . # < v > # < v > > > # < v # # . . # # . . . # . . # #

# # . . . . . . # . # # . < v # # # < v # v v > . # . . . # # # # # # . # . . .

. . . . . # # . . . . . . . v # # < v # . # # . . . . # . . . # . . . . . # # .

. # # . . # # . # . . # . . # # # # # # # # . # . # # # # # # # # # # # . . . .

. # . # . # . . . . # # . . . # # . . . . . # # . . . . # # # # . . . . . # # .

G . . . # # # . # # # . . . . . . . . # # # # # # . . . . . . . . # # # # # # #

----------------------------------

----------------------------------

# # # < < < < < ^ # # . . . . . # # S < ^ > # < < < ^ # < < < S > > > > # ^ > >

< < < v # # # # < < ^ # # # . # # ^ # # ^ # < ^ # # < < v # # # # # # v > > # v

v # < < < ^ # < < < < < ^ # # < < < < < < ^ # < < < < v # # < < ^ > # v # # # v

v > # < < < < < v # # < < < < v # # < v # < < v # < v # . . # # ^ # # # # # # v

v # < < < < v # # ^ > # < v # v < ^ # # # # v # # # v # # # < ^ > > # # # # < v

v > # < v # v # # ^ # . # v > # # < < < < ^ # # < < v > > # # ^ # v # # # # v #

^ # < < v # v > > > > # . # # . # # # # # < < < v # # # v > > > > # < < < < v #

< < < v # ^ # # v # v > # ^ # # . . # . # # # < v > # # v v # # v > > v # # # #

v # # # < ^ # < v > v # < ^ > # . # . # ^ # < v # v # # # # < < v v v v > # # #

v > # # # ^ # v # # v > # ^ > > # . # # ^ # # v # # # # # < < < v # # v # # # .

# v > > > > > # # # v # ^ > # # . . # # < < < v # # ^ # # # # # v > # # # . # .

. # # # v # # < ^ # v # ^ # # . # . . # < < < v > > > > # # < < v v > # ^ # . .

. # # # v # # < < < < < < ^ # . . # . # # # < v # # # # # # v # # # v > > > # .
. . # # v # . # < < ^ # # < ^ # # # # ^ # # # v > > > # # # v # # # # v # v > #

# # < < v # # # < < < < < < ^ # # # ^ > # # # v # # v # # # v # # . . # . # # .

^ > # # v > > # # # v # # < < ^ # ^ > # # < < v > > v # # # # # # # # . . # # .

^ # # # v # # ^ > # v > # # < ^ # ^ # < < < < v # v v > # # . # . . # . . . . .

< < < < v # ^ > # . # # . # # < < < ^ # # v # # . # # # # # . # # # . # # . . #

# # # # < < ^ > # # . . # # # v # < < < < v # # # . . # # . . . . . . # # # # .

< ^ # < < < ^ # < ^ # . # < < v # # v # # v # # ^ # # . . . . # # # . . . # . .

< < < v # # < < < ^ > # < v # # ^ # v ^ # v # ^ > # # . # # # . . . # # # . # .

v # # # < < ^ # # ^ # < v # # ^ > # # < < v > > > > > # ^ > > # . . # . . # # .

v > # . # < < ^ # ^ # # v # # ^ # ^ > # < v # v v # v > > # v > # . . # . # . #

v # # # . # # < < < < < v > # < < ^ # < v # < v # # # # v > # v # # . # # # # .

v > # # # < < < v # < v # # . # < < < v # # < v # # # # v v > # ^ > # # # . . #

v # # . . # # # v > # # # # # ^ # v # v > > # v > # # < v v v > > > > # . . # .

v # . # # < < < v # . . # # < < ^ # < v # # . # v > > > v # v v v # v > # # # .

v > # . # # # < v > # . . . # < < < < v > # # # v # # v # ^ # v v > # v # . . .

v # # # . # # v # v > # . # # v # < v # # . . # # # < v > > # v v # < v > # # #

v # # . # # . # . # < ^ # . . # < < v # # . # < ^ # < v v # # # # . # # v > > >

. # # # # . # . # # < < ^ # # . # # v > > # . # < < v # v # # . . # # # v # # v

# . # < ^ # . . # . # # < < ^ # # < v # # . # < < v # # # . # # # . # . # # < v

. . . # < ^ # # # # < < v # < < < < v > > # . # < v > # # # . # . . . . # < < v

^ # # < < < ^ # # . # # v > # v # # # v # # # . # v # < ^ > # # # # . # < < v #

< < ^ # # < < ^ # # < < ^ # < v > # < v > > > # < v # # ^ > # # . . . # < v # #

# # < < < < < ^ # ^ # # < < v # # # < v # v v > v # ^ > > # # # # # # . # v > >

< < < < v # # < < < < < < < v # # < v # . # # v v > > # v > > # . . . . . # # v

v # # < v # # v # < v # < v # # # # # # # # . # v # # # # # # # # # # # . < < v

v # . # v # < < < v # # < v > # # ^ > > > > # # v > > > # # # # ^ > > > > # # v

G . . . # # # v # # # < < v v > > > > # # # # # # v v v > > > > > # # # # # # #

----------------------------------

You might also like