We can do this by constructing a search tree for a problem "on the fly".
The search tree is similar to those produced by the BFS and DFS graph search algorithms already described.
We can construct a state space search tree without a problem graph because we have Move objects that know how to construct new states given a current state.