RoomInfo.java Source code

Java tutorial

Introduction

Here is the source code for RoomInfo.java

Source

/*
 * 
 * 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);
        }
    }
}