import stanford.karel.*;
public class MazeSolvingKarel extends SuperKarel {
public void run() {
markEdge();
while(noBeepersInBag() && !cornerColorIs(GRAY))
search();
followPath();
}
public void search() {
if(beepersPresent()) {
pickBeeper();
markHasPath();
}
if(!cornerColorIs(GRAY) && noBeepersInBag()) {
if(cornerColorIs(GREEN)) {
// We're on an edge cell
// so we have to search and mark ourself blue
turnAround();
if(frontIsClear()) {
move();
if(cornerColorIs(CYAN)) {
moveBackOne();
markIgnore();
} else {
moveBackOne();
markJustVisited();
}
} else {
markJustVisited();
}
turnAround();
}
if(cornerColorIs(BLUE) || cornerColorIs(CYAN)) {
// We've been here before
if(cornerColorIs(BLUE))
markTrail();
turnAround();
searchRight();
searchRight();
searchRight();
turnLeft();
if(noBeepersInBag()) {
markVisited();
examineNeighbors();
if(cornerColorIs(YELLOW))
markVisited();
else
markDead();
}
if(cornerColorIs(CYAN))
markTrail();
} else if(!cornerColorIs(RED) && !cornerColorIs(MAGENTA)) {
markEdge();
}
}
}
public void examineNeighbors() {
turnAround();
examineRight();
examineRight();
examineRight();
turnLeft();
}
public void examineRight() {
turnRight();
if(frontIsClear()) {
move();
if(cornerColorIs(GRAY)) {
moveBackOne();
} else if(cornerColorIs(RED)) {
moveBackOne();
markDead();
} else if(cornerColorIs(MAGENTA)) {
markEdge();
moveBackOne();
} else {
moveBackOne();
markHasPath();
}
}
}
public void searchRight() {
turnRight();
if(frontIsClear() && noBeepersInBag()) {
move();
if(!cornerColorIs(MAGENTA))
search();
turnAround();
move();
turnAround();
}
}
public void followPath() {
while(!cornerColorIs(YELLOW)) {
turnLeft();
if(frontIsClear()) {
move();
if(cornerColorIs(GRAY) || cornerColorIs(BLUE)) {
moveBackOne();
turnAround();
}
} else {
turnAround();
}
}
}
public void moveBackOne() {
turnAround();
move();
turnAround();
}
public void markVisited() {
paintCorner(BLUE);
}
public void markJustVisited() {
paintCorner(CYAN);
}
public void markIgnore() {
paintCorner(MAGENTA);
}
public void markEdge() {
paintCorner(GREEN);
}
public void markTrail() {
paintCorner(RED);
}
public void markDead() {
paintCorner(GRAY);
}
public void markHasPath() {
paintCorner(YELLOW);
}
}