From quick glance it picks random matching word and goes with that, never reverting that decision. This allows only for generating rather low-density crosswords, where much of the board is empty.<p>Keeping a "stack" of crosswords, each one with one word added, iterating through possible words, and when nothing matches dropping "stack frame" and retrying with another word on previous level, would allow to generate much denser crosswords.
Working on an activity book for kids and was contemplating writing something like this, and then realized it was definitely non-trivial. Thanks for the work!