CWL IN THIS FILE.
;; YOUR CWLs WILL BE SUFFICIENT TO IDENTIFY YOU AND, IF YOU HAVE
ONE, YOUR
;; PARTNER.
;;
(require spd/tags)
(@assignment psets/pset-11); Do not edit or remove this tag
;; Replace the first set of '???'s with your cwl.
;; If you have a partner, replace the second set of '???'s with their cwl.
;;
(@cwl ??? ???)
(@problem 1)
;;
;; In this problem set you will be working with a simple representation of a
;; secret castle. Unsurpringly, the rooms and doors in this castle form a
;; graph. The figure in:
;; https://cs110.students.cs.ubc.ca/psets/pset-11-image.png
;; shows a small castle with 5 rooms named A, B, C, D, and E. A has exits
;; that lead to rooms B, D and E. B has a single exit that leads to C, and
;; so on. The ovals (long circles) are locks; the number in the oval is the
;; number of the key required to open that lock. The underlined numbers are
;; keys.
;;
;; E has a lock that requires key # 1 to open. The lock at room D requires key
;; # 2 to open it. After you enter a room you automatically pickup any keys
;; that are there. So after you get into room B you automatically pickup key 2.
;; After you get into room C you automatically pickup key 1.
;;
;; Note that in general a door might have multiple locks, and a room might
;; provide multiple keys.
;;
;; Here are the data definitions we use.
;; Data definitions:
(@htdd Room)
(define-struct room (name locks keys exits))
, ;; Room is (make-room String (listof Natural) (listof Natural) (listof String))
;; interp. each room has
;; - a Name
;; - locks that require a key of the same number to open
;; - keys that open locks of the same number
;; - doors to other rooms, these are represented as a list
;; of strings where each string is the name of a room
;;
;; NOTE: The keys can be for any rooms in the castle, they do not have
;; to be for one of the rooms in exits.
;;
;; This is a generative graph problem. Note that a room has a list of the names
;; of the rooms it has exits to -- the names not the actual rooms. Therefore a
;; generative step has to take the name and generate the actual Room. To do
;; that we add a new opaque data definition for a type called Map. When
;; we say that Map is opaque we mean that you should not try to look inside
;; of it. It is a secret map of the castle. Instead we are providing a
;;function
;; called get-room that given a room name and a castle will generate the room.
;;
(@htdd Map)
;; Map is ???
;; interp. an opaque data type that represents a map from room names to rooms.
;; Only the provided function get-room knows how to work with a map.
;;
#|
Here is a partially blended template. It includes the Room and (listof String)
functions, as well as the generative step of calling get-room to get a
room from
a room name. But it doesn't include the trivial? test to terminate the
generative recursion or anything to prevent going in cycles. You must complete
the blending for your own purposes.
(define (fn-for-castle start castle)
(local [(define (fn-for-room r)
(... (room-name r)
(room-locks r)
(room-keys r)
(fn-for-los (room-exits r))))