// Chapter 5 of C++ How to Program // Programming Challenge 12 (Solution) // This solution assumes that there is only one // entrance and one exit for a given maze, and // these are the only two periods on the borders. #include using std::cout; using std::cin; #include enum Direction { DOWN, RIGHT, UP, LEFT }; const int X_START = 2; const int Y_START = 0; // starting maze coordinates static bool flag = false; void mazeTraversal( char [][ 12 ], int, int, int, bool ); void printMaze( const char[][ 12 ] ); bool validMove( const char [][ 12 ], int, int ); bool coordsAreEdge( int, int ); int main() { char maze[ 12 ][ 12 ] = { {'#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#'}, {'#', '.', '.', '.', '#', '.', '.', '.', '.', '.', '.', '#'}, {'.', '.', '#', '.', '#', '.', '#', '#', '#', '#', '.', '#'}, {'#', '#', '#', '.', '#', '.', '.', '.', '.', '#', '.', '#'}, {'#', '.', '.', '.', '.', '#', '#', '#', '.', '#', '.', '.'}, {'#', '#', '#', '#', '.', '#', '.', '#', '.', '#', '.', '#'}, {'#', '.', '.', '#', '.', '#', '.', '#', '.', '#', '.', '#'}, {'#', '#', '.', '#', '.', '#', '.', '#', '.', '#', '.', '#'}, {'#', '.', '.', '.', '.', '.', '.', '.', '.', '#', '.', '#'}, {'#', '#', '#', '#', '#', '#', '.', '#', '#', '#', '.', '#'}, {'#', '.', '.', '.', '.', '.', '.', '#', '.', '.', '.', '#'}, {'#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#', '#'} }; mazeTraversal( maze, X_START, Y_START, RIGHT, true ); return 0; } // end main // assume that there is exactly 1 entrance 1 exit to the maze. void mazeTraversal( char maze[][ 12 ], int xCoord, int yCoord, int direction, bool firstMove ) { maze[ xCoord ][ yCoord ] = 'x'; printMaze( maze ); if ( !firstMove ) if ( coordsAreEdge( xCoord, yCoord ) ) if ( xCoord != X_START && yCoord != Y_START ) { cout << "\nMaze successfully exited!\n\n"; return; // maze is complete } // end if else { cout << "\nArrived back at the starting location," << " maze has no exit."; return; } // end else int move = direction; for ( int count = 0; count < 4; ++count ) { switch( move ) { case DOWN: if ( validMove( maze, xCoord + 1, yCoord ) ) { mazeTraversal( maze, xCoord + 1, yCoord, LEFT, false ); return; } break; case RIGHT: if ( validMove( maze, xCoord, yCoord + 1 ) ) { mazeTraversal( maze, xCoord, yCoord + 1, DOWN, false ); return; } break; case UP: if ( validMove( maze, xCoord - 1, yCoord ) ) { mazeTraversal( maze, xCoord - 1, yCoord, RIGHT, false ); return; } break; case LEFT: if ( validMove( maze, xCoord, yCoord - 1 ) ) { mazeTraversal( maze, xCoord, yCoord - 1, UP, false ); return; } break; } // end switch move++; move %= 4; } // end for } // end mazeTraverse // function validMove definition bool validMove( const char maze[][ 12 ], int r, int c ) { return ( r >= 0 && r <= 11 && c >= 0 && c <= 11 && maze[ r ][ c ] != '#' ); } // end function validMove // function coordsAreEdge definition bool coordsAreEdge( int x, int y ) { if ( x == 0 || x == 11 || y == 0 || y == 11 ) return true; else return false; } // end function coordsAreEdge // output maze void printMaze( const char maze[][ 12 ] ) { for ( int x = 0; x < 12; ++x ) { for ( int y = 0; y < 12; ++y ) cout << maze[ x ][ y ] << ' '; cout << '\n'; } // end for cout << "\nHit return to see next move\n"; cin.get(); } // end function printMaze /************************************************************************** * (C) Copyright 1992-2003 by Deitel & Associates, Inc. and Prentice * * Hall. All Rights Reserved. * * * * DISCLAIMER: The authors and publisher of this book have used their * * best efforts in preparing the book. These efforts include the * * development, research, and testing of the theories and programs * * to determine their effectiveness. The authors and publisher make * * no warranty of any kind, expressed or implied, with regard to these * * programs or to the documentation contained in these books. The authors * * and publisher shall not be liable in any event for incidental or * * consequential damages in connection with, or arising out of, the * * furnishing, performance, or use of these programs. * *************************************************************************/