The short answer is depth-first search with backtracking. You can do breadth-first if you prefer, but your little robot will do a lot more walking back and forth then.
More concretely, assume we're given:
// Moves to the given room, which must have a door between
// it and the current room.
moveTo(room);
// Returns the list of room ids directly reachable from
// the current room.
getDoors();
// Returns true if this room is the exit.
isExit();
To find the exit, we just need:
void escape(int startingRoom) {
Stack<int> path = new Stack<int>();
path.push(startingRoom);
escape(path);
}
boolean escape(Stack<int> path) {
for (int door : getDoors()) {
// Stop if we've escaped.
if (isExit()) return true;
// Don't walk in circles.
if (path.contains(door)) continue;
moveTo(door);
path.push(door);
if (escape(path)) return true;
// If we got here, the door didn't lead to an exit. Backtrack.
path.pop();
moveTo(path.peek());
}
}
Call escape() with the ID of the start room and it will move the robot to the exit (by calling moveTo()).