/*-------------------------------------- * Function: SolveMaze() * Parameters: pt Den punkt utifrån vilken vi vill lösa labyrinten. * num_calls Räknare för antal anrop. * unmark Indikerar huruvida UnmarkSquare()-funktionen ska * anropas. * * Description: * Löser labyrinten (om möjligt) och räknar antalet anrop. *------------------------------------*/ static bool SolveMaze(pointT pt, int* num_calls, bool unmark) { ++(*num_calls); if (OutsideMaze(pt)) return TRUE; if (IsMarked(pt)) return FALSE; MarkSquare(pt); for (directionT dir = North; dir <= West; dir++) { // Om det är en vägg ivägen går vi vidare till nästa riktning. if (WallExists(pt, dir)) continue; if (SolveMaze(AdjacentPoint(pt, dir), num_calls, unmark)) { // Vi måste avmarkera även här så att inte lösningen ligger kvar // som markerad i labyrinten. if (unmark) UnmarkSquare(pt); return TRUE; } } if (unmark) UnmarkSquare(pt); return FALSE; }
bool SolveMaze(pointT pt) { if (OutsideMaze(pt)) return true; if (IsMarked(pt)) return false; MarkSquare(pt); for (directionT dir = North; dir <= West; dir=directionT(dir + 1)) { if (!WallExists(pt, dir) && SolveMaze(AdjacentPoint(pt, dir))) { return true; } } UnmarkSquare(pt); return false; }