private static bool RunBoggleTest(string testFile, string testName) { Boggle b = new Boggle(); Console.WriteLine("------------------------------ Running " + testName); Console.WriteLine(""); var input = Regex.Split(System.IO.File.ReadAllText(testFile), @"\r\n\r\n\r\n").Where(s => s != String.Empty).ToArray(); string board = input[0]; List <string> answers = Regex.Split(input[1], @"\r\n\r\n").Where(s => s != String.Empty).ToList(); string dictionary = input[2]; var words = Regex.Split(dictionary, @"\r\n").Where(s => s != String.Empty); b.SetLegalWords(words); var ans = b.SolveBoard(4, 4, board).ToList(); ans.Sort(); answers.Sort(); for (int i = 0; i < ans.Count; i++) { Console.WriteLine("{0} - {1}", answers[i], ans[i]); if (answers[i] != ans[i]) { return(false); } } return(true); }
static void Main(string[] args) { char[,] board = { { 'A', 'L', 'B', 'P' }, { 'C', 'O', 'E', 'Y' }, { 'F', 'C', 'H', 'P' }, { 'B', 'A', 'D', 'A' } }; List <string> correctWords = new List <string> { "AFOCAL", "CHAPEL", "CLOCHE", "DHOLE", "LOCHE", "CHOLA", "CHELA", "HOLEY", "FOCAL", "FOLEY", "COLEY", "COLBY", "COHAB", "COBLE", "DACHA", "BACHA", "BACCO", "BACCA", "BLECH", "PHOCA", "ALOHA", "ALEPH", "CHAPE", "BOCCA", "BOCCE", "BOCHE", "LECH", "PECH", "OCHE", "FOAL", "YECH", "OBEY", "YEBO", "LOCA", "LOBE", "LOCH", "HYPE", "HELO", "PELA", "HOLE", "COCA" }; List <string> expanded = new List <string>(correctWords); expanded.AddRange(new string[] { "DUMMY", "TESTING", "WORDS", "NAZI" }); List <string> boggleSolver = Boggle.solveBoggle(board, expanded); // Console.WriteLine($"SW: {boggleSolver.Count} CW: {correctWords.Count}"); Console.WriteLine("Found words: \n"); foreach (string i in boggleSolver) { Console.WriteLine(i); } }
public ResultModel Run(Boggle boggle) { var result = new ResultModel(); var visited = new bool[boggle.RowSize, boggle.ColSize]; for (var i = 0; i < boggle.RowSize; i++) { for (var j = 0; j < boggle.ColSize; j++) { Chain(i, j, string.Empty); } } return(result); void Chain(int rowIndex, int colIndex, string chain) { visited[rowIndex, colIndex] = true; chain = $"{chain}{boggle.Grid[rowIndex][colIndex]}"; if (!CheckChain(chain)) { visited[rowIndex, colIndex] = false; return; } var rowMin = Math.Max(0, rowIndex - 1); var colMin = Math.Max(0, colIndex - 1); var rowMax = Math.Min(boggle.RowSize - 1, rowIndex + 1); var colMax = Math.Min(boggle.ColSize - 1, colIndex + 1); for (var x = rowMin; x <= rowMax; x++) { for (var y = colMin; y <= colMax; y++) { if (visited[x, y]) { continue; } Chain(x, y, chain); } } visited[rowIndex, colIndex] = false; } bool CheckChain(string chain) { ChainCounter++; return(chain.Length <= _maxWordLength); } }
public void GetAdjacentCells_When2on2_ReturnsAllOtherCoordinates() { var boggles = new Boggle(new char[][] { new[] { 'E', 'A' }, new[] { 'N', 'L' } }, "..."); var adj = boggles.GetAdjacentCells(0, 0); Assert.AreEqual(3, adj.Count()); }
public ResultModel Run(Boggle boggle) { var result = new ResultModel(); boggle.MapCells(); for (var i = 0; i < boggle.RowSize; i++) { for (var j = 0; j < boggle.ColSize; j++) { Chain(boggle.CellGrid[i][j], string.Empty); } } return(result); void Chain(BoggleCell cell, string chain) { cell.IsVisited = true; chain = $"{chain}{cell.Letter}"; if (!CheckChain(chain)) { cell.IsVisited = false; return; } foreach (var adjacentCell in cell.AdjacentCells) { if (adjacentCell.IsVisited) { continue; } Chain(adjacentCell, chain); } cell.IsVisited = false; } bool CheckChain(string chain) { ChainCounter++; return(chain.Length <= _maxWordLength); } }
public ResultModel Run(Boggle boggle) { var result = new ResultModel(); boggle.MapCells(); for (var i = 0; i < boggle.RowSize; i++) { for (var j = 0; j < boggle.ColSize; j++) { Chain(boggle.CellGrid[i][j], string.Empty); } } return(result); void Chain(BoggleCell cell, string chain) { cell.IsVisited = true; chain = $"{chain}{cell.Letter}"; if (!CheckChain(chain)) { cell.IsVisited = false; return; } foreach (var adjacentCell in cell.AdjacentCells) { if (adjacentCell.IsVisited) { continue; } Chain(adjacentCell, chain); } cell.IsVisited = false; } bool CheckChain(string chain) { ChainCounter++; if (chain.Length < 3) { return(true); } if (chain.Length > boggle.Size) { return(false); } var trie = RootTrie; foreach (var letter in chain) { trie = trie[letter]; if (trie == null) { return(false); } } if (trie.IsLastLetter) { result.Words.Add(chain); } return(true); } }