public List <string> FindAllWords() { var words = new SortedSet <string>(); var lettersInPath = new BitArray(ScrambledWord.Length); var searcher = new FlexibleBacktrackingSearch <WordSearchState>( state => state.GetChildren(ScrambledWord, lettersInPath), true); for (int i = 0; i < ScrambledWord.Length; ++i) { string initialString = ScrambledWord[i].ToString(); var initialNode = Dictionary.FindNode(initialString); if (initialNode != null) { lettersInPath[i] = true; searcher.Search( new WordSearchState(initialString, initialNode), node => { if (node.State.IsWord && node.State.CurrentString.Length >= MinWordLength) { words.Add(node.State.CurrentString); } return(NodeOption.Continue); } ); lettersInPath[i] = false; } } return(words.ToList()); }
public WordSearchState( Tile startingTile, PrefixTreeDictionary dictionary, bool useAlternate = false) { Validate.IsNotNull(startingTile, "startingTile"); Validate.IsNotNull(dictionary, "dictionary"); CurrentString = useAlternate ? startingTile.AlternateLetters : startingTile.Letters; LastTileAdded = startingTile; DictionaryNode = dictionary.FindNode(CurrentString); }