Mega Code Archive

 
Categories / Java / Collections Data Structure
 

Find the lost keys

/*  *   * Chapter 10 - AI-Based Problem Solving The Art of Java by Herbert Schildt and  * James Holmes McGraw-Hill/Osborne 2003  */ import java.util.Stack; //Room information. class RoomInfo {   String from;   String to;   boolean skip;   RoomInfo(String f, String t) {     from = f;     to = t;     skip = false;   } } public class Keys {   final int MAX = 100;   // This array holds the room information.   RoomInfo room[] = new RoomInfo[MAX];   int numRooms = 0; // number of rooms   Stack btStack = new Stack(); // backtrack stack   public static void main(String args[]) {     String to, from;     Keys ob = new Keys();     ob.setup();     from = "front_door";     to = "keys";     ob.iskeys(from, to);     if (ob.btStack.size() != 0)       ob.route(to);   }   // Initialize the room database.   void setup() {     addRoom("front_door", "lr");     addRoom("lr", "bath");     addRoom("lr", "hall");     addRoom("hall", "bd1");     addRoom("hall", "bd2");     addRoom("hall", "mb");     addRoom("lr", "kitchen");     addRoom("kitchen", "keys");   }   // Put rooms into the database.   void addRoom(String from, String to) {     if (numRooms < MAX) {       room[numRooms] = new RoomInfo(from, to);       numRooms++;     } else       System.out.println("Room database full.\n");   }   // Show the route.   void route(String to) {     Stack rev = new Stack();     RoomInfo r;     int num = btStack.size();     // Reverse the stack to display path.     for (int i = 0; i < num; i++)       rev.push(btStack.pop());     for (int i = 0; i < num; i++) {       r = (RoomInfo) rev.pop();       System.out.print(r.from + " to ");     }     System.out.println(to);   }   /*    * If there is a path between from and to, return true, otherwise return    * false.    */   boolean match(String from, String to) {     for (int i = numRooms - 1; i > -1; i--) {       if (room[i].from.equals(from) && room[i].to.equals(to)           && !room[i].skip) {         room[i].skip = true; // prevent reuse         return true;       }     }     return false; // not found   }   // Given from, find any path.   RoomInfo find(String from) {     for (int i = 0; i < numRooms; i++) {       if (room[i].from.equals(from) && !room[i].skip) {         RoomInfo r = new RoomInfo(room[i].from, room[i].to);         room[i].skip = true; // prevent reuse         return r;       }     }     return null;   }   // Determine if there is a path between from and to.   void iskeys(String from, String to) {     int dist;     RoomInfo r;     // See if at destination.     if (match(from, to)) {       btStack.push(new RoomInfo(from, to));       return;     }     // Try another connection.     r = find(from);     if (r != null) {       btStack.push(new RoomInfo(from, to));       iskeys(r.to, to);     } else if (btStack.size() > 0) {       // Backtrack and try another connection.       r = (RoomInfo) btStack.pop();       iskeys(r.from, r.to);     }   } }