public Solution SolveBrute(char[,] board) { var changes = board.ToPoints().Where(p => board.Get(p) != 'o') .Select(p => (board.Get(p) == '.' ? ".+xo" : board.Get(p) == 'o' ? "o" : (board.Get(p) + "o")).Select(c => new { c, p }).ToArray()) .ToArray(); var bestScore = 0; var bestBoards = new List <char[, ]>(); foreach (var comb in CombinatoricsHelper.Selections(changes)) { var resultBoard = board.ShallowClone(); foreach (var change in comb) { resultBoard.Set(change.p, change.c); } if (!IsBoardOk(resultBoard)) { continue; } var score = Score(resultBoard); if (score > bestScore) { bestScore = score; bestBoards.Clear(); bestBoards.Add(resultBoard); } else if (score == bestScore) { bestBoards.Add(resultBoard); } } return(new Solution { Score = bestScore, Board = bestBoards.Count == 0 ? null : bestBoards[0] }); }