Program 4
Program 4
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
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;
}
if (head != NULL) {
while (h -> next != NULL) {
h = h -> next;
}
h -> next = n;
} else {
head = n;
}
size++;
}
/*-------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;
}
}
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 readMaze();
int main() {
navMaze(readMaze());
}
// read values
ifile >> m.width;
ifile >> m.height;
ifile.close();
return m;
}
/*---------prints a maze---------*/
void printMaze( maze m ) {
int width = m.width;
int height = m.height;
char ** grid = m.grid;
/*---------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;
// 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, '<');
}
}
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
----------------------------------
# # # . . . . . . # # . . . . . # # 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 . # # . . . . . . . . # . . # .
. # . # # . . . . # . . # # . . . # . . # # . # . . . . . # . . . # . . # # # .
. . # . # # # . . . # . . . # . . . . . . # # # . # # . # . # . . . # . # . . .
. # # # . # # . # . . # . # # . # . . # # . . # # # . . . . # . . # . . . # # #
. # # . # # . # . # . . # . . # . . . # # . # . . # . . . # # # # . # # . . . .
. # # # # . # . # # . . . # # . # # . . . # . # . . . # . # # . . # # # . # # .
# . # . . # . . # . # # . . . # # . . # # . # . . . # # # . # # # . # . # # . .
. . . # . . # # # # . . . # . . . . . . . # . # . . . # # # . # . . . . # . . .
. # # . . . . # # . # # . . # . # # # . # # # . # . # . . . # # # # . # . . . #
. . . # # . . . # # . . . # . . . # . . . . . # . . # # . . # # . . . # . . # #
# # . . . . . . # . # # . . . # # # . . # . . . . # . . . # # # # # # . # . . .
. . . . . # # . . . . . . . . # # . . # . # # . . . . # . . . # . . . . . # # .
. # # . . # # . # . . # . . # # # # # # # # . # . # # # # # # # # # # # . . . .
. # . # . # . . . . # # . . . # # . . . . . # # . . . . # # # # . . . . . # # .
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 # . # # . . . . # . . . # . . . . . # # .
. # # . . # # . # . . # . . # # # # # # # # . # . # # # # # # # # # # # . . . .
. # . # . # . . . . # # . . . # # . . . . . # # . . . . # # # # . . . . . # # .
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
G . . . # # # v # # # < < v v > > > > # # # # # # v v v > > > > > # # # # # # #
----------------------------------