public static List <Combination> AllCombinations(List <List <ICell> > cells)
        {
            int size = cells.Count;
            List <Combination> combinations = new List <Combination>();
            int         index           = 0;
            CellType    previous        = CellType.Default;
            int         count           = 0;
            Combination currCombination = new Combination();

            for (int i = 0; i < size; i++)
            {
                for (int j = 0; j < size; j++)
                {
                    index           = i;
                    previous        = cells[i][j].Type;
                    count           = 1;
                    currCombination = new Combination();
                    currCombination.combination.Add(new Position(i, j));

                    while (++index < size && previous == cells[index][j].Type && previous != CellType.Default)
                    {
                        currCombination.combination.Add(new Position(index, j));
                        count++;
                    }

                    if (count > 2 && !combinations.Contains(currCombination))
                    {
                        combinations.Add(currCombination);
                    }

                    index           = i;
                    previous        = cells[i][j].Type;
                    count           = 1;
                    currCombination = new Combination();
                    currCombination.combination.Add(new Position(i, j));

                    while (--index > -1 && previous == cells[index][j].Type && previous != CellType.Default)
                    {
                        currCombination.combination.Add(new Position(index, j));
                        count++;
                    }

                    if (count > 2 && !combinations.Contains(currCombination))
                    {
                        combinations.Add(currCombination);
                    }

                    index           = j;
                    previous        = cells[i][j].Type;
                    count           = 1;
                    currCombination = new Combination();
                    currCombination.combination.Add(new Position(i, j));

                    while (++index < size && previous == cells[i][index].Type && previous != CellType.Default)
                    {
                        currCombination.combination.Add(new Position(i, index));
                        count++;
                    }

                    if (count > 2 && !combinations.Contains(currCombination))
                    {
                        combinations.Add(currCombination);
                    }

                    index           = j;
                    previous        = cells[i][j].Type;
                    count           = 1;
                    currCombination = new Combination();
                    currCombination.combination.Add(new Position(i, j));

                    while (--index > -1 && previous == cells[i][index].Type && previous != CellType.Default)
                    {
                        currCombination.combination.Add(new Position(i, index));
                        count++;
                    }

                    if (count > 2 && !combinations.Contains(currCombination))
                    {
                        combinations.Add(currCombination);
                    }
                }
            }

            return(ConcatCombinations(combinations, cells));
        }
        public static List <Combination> AllMoves(List <List <ICell> > cells)
        {
            List <Combination> moves = new List <Combination>();
            int size = cells.Count;

            for (int i = 0; i < size; i++)
            {
                int      count    = 0;
                CellType previous = CellType.Default;
                for (int j = 0; j < size; j++)
                {
                    if (cells[i][j].Type == previous && previous != CellType.Default)
                    {
                        count = 2;
                    }
                    else
                    {
                        count = 1;
                    }

                    previous = cells[i][j].Type;

                    if (count == 2)
                    {
                        if (j > 1)
                        {
                            if (i > 0 && cells[i - 1][j - 2].Type == previous)
                            {
                                Combination currentMove = new Combination();

                                currentMove.combination.Add(new Position(i - 1, j - 2));
                                currentMove.combination.Add(new Position(i, j - 2));

                                if (!moves.Contains(currentMove))
                                {
                                    moves.Add(currentMove);
                                }
                            }

                            if (i < size - 1 && cells[i + 1][j - 2].Type == previous)
                            {
                                Combination currentMove = new Combination();

                                currentMove.combination.Add(new Position(i + 1, j - 2));
                                currentMove.combination.Add(new Position(i, j - 2));

                                if (!moves.Contains(currentMove))
                                {
                                    moves.Add(currentMove);
                                }
                            }

                            if (j > 2 && cells[i][j - 3].Type == previous)
                            {
                                Combination currentMove = new Combination();

                                currentMove.combination.Add(new Position(i, j - 3));
                                currentMove.combination.Add(new Position(i, j - 2));

                                if (!moves.Contains(currentMove))
                                {
                                    moves.Add(currentMove);
                                }
                            }
                        }

                        if (j < size - 1)
                        {
                            if (i > 0 && cells[i - 1][j + 1].Type == previous)
                            {
                                Combination currentMove = new Combination();

                                currentMove.combination.Add(new Position(i - 1, j + 1));
                                currentMove.combination.Add(new Position(i, j + 1));

                                if (!moves.Contains(currentMove))
                                {
                                    moves.Add(currentMove);
                                }
                            }

                            if (i < size - 1 && cells[i + 1][j + 1].Type == previous)
                            {
                                Combination currentMove = new Combination();

                                currentMove.combination.Add(new Position(i + 1, j + 1));
                                currentMove.combination.Add(new Position(i, j + 1));

                                if (!moves.Contains(currentMove))
                                {
                                    moves.Add(currentMove);
                                }
                            }

                            if (j < size - 2 && cells[i][j + 2].Type == previous)
                            {
                                Combination currentMove = new Combination();

                                currentMove.combination.Add(new Position(i, j + 2));
                                currentMove.combination.Add(new Position(i, j + 1));

                                if (!moves.Contains(currentMove))
                                {
                                    moves.Add(currentMove);
                                }
                            }
                        }
                    }
                }

                previous = CellType.Default;
                for (int j = 0; j < size; j++)
                {
                    if (cells[j][i].Type == previous && previous != CellType.Default)
                    {
                        count = 2;
                    }
                    else
                    {
                        count = 1;
                    }

                    previous = cells[j][i].Type;

                    if (count == 2)
                    {
                        if (j > 1)
                        {
                            if (i > 0 && cells[j - 2][i - 1].Type == previous)
                            {
                                Combination currentMove = new Combination();

                                currentMove.combination.Add(new Position(j - 2, i - 1));
                                currentMove.combination.Add(new Position(j - 2, i));

                                if (!moves.Contains(currentMove))
                                {
                                    moves.Add(currentMove);
                                }
                            }

                            if (i < size - 1 && cells[j - 2][i + 1].Type == previous)
                            {
                                Combination currentMove = new Combination();

                                currentMove.combination.Add(new Position(j - 2, i + 1));
                                currentMove.combination.Add(new Position(j - 2, i));

                                if (!moves.Contains(currentMove))
                                {
                                    moves.Add(currentMove);
                                }
                            }

                            if (j > 2 && cells[j - 3][i].Type == previous)
                            {
                                Combination currentMove = new Combination();

                                currentMove.combination.Add(new Position(j - 3, i));
                                currentMove.combination.Add(new Position(j - 2, i));

                                if (!moves.Contains(currentMove))
                                {
                                    moves.Add(currentMove);
                                }
                            }
                        }

                        if (j < size - 1)
                        {
                            if (i > 0 && cells[j + 1][i - 1].Type == previous)
                            {
                                Combination currentMove = new Combination();

                                currentMove.combination.Add(new Position(j + 1, i - 1));
                                currentMove.combination.Add(new Position(j + 1, i));

                                if (!moves.Contains(currentMove))
                                {
                                    moves.Add(currentMove);
                                }
                            }

                            if (i < size - 1 && cells[j + 1][i + 1].Type == previous)
                            {
                                Combination currentMove = new Combination();

                                currentMove.combination.Add(new Position(j + 1, i + 1));
                                currentMove.combination.Add(new Position(j + 1, i));

                                if (!moves.Contains(currentMove))
                                {
                                    moves.Add(currentMove);
                                }
                            }

                            if (j < size - 2 && cells[j + 2][i].Type == previous)
                            {
                                Combination currentMove = new Combination();

                                currentMove.combination.Add(new Position(j + 2, i));
                                currentMove.combination.Add(new Position(j + 1, i));

                                if (!moves.Contains(currentMove))
                                {
                                    moves.Add(currentMove);
                                }
                            }
                        }
                    }
                }

                previous = CellType.Default;
                for (int j = 0; j < size - 1; j++)
                {
                    if (cells[i][j + 1].Type == previous && previous != CellType.Default)
                    {
                        count = 2;
                    }
                    else
                    {
                        count = 1;
                    }

                    if (count == 2)
                    {
                        if (i > 0 && cells[i - 1][j].Type == previous)
                        {
                            Combination currentMove = new Combination();

                            currentMove.combination.Add(new Position(i - 1, j));
                            currentMove.combination.Add(new Position(i, j));

                            if (!moves.Contains(currentMove))
                            {
                                moves.Add(currentMove);
                            }
                        }

                        if (i < size - 1 && cells[i + 1][j].Type == previous)
                        {
                            Combination currentMove = new Combination();

                            currentMove.combination.Add(new Position(i + 1, j));
                            currentMove.combination.Add(new Position(i, j));

                            if (!moves.Contains(currentMove))
                            {
                                moves.Add(currentMove);
                            }
                        }
                    }

                    previous = cells[i][j].Type;
                }

                previous = CellType.Default;
                for (int j = 0; j < size - 1; j++)
                {
                    if (cells[j + 1][i].Type == previous && previous != CellType.Default)
                    {
                        count = 2;
                    }
                    else
                    {
                        count = 1;
                    }

                    if (count == 2)
                    {
                        if (i > 0 && cells[j][i - 1].Type == previous)
                        {
                            Combination currentMove = new Combination();

                            currentMove.combination.Add(new Position(j, i - 1));
                            currentMove.combination.Add(new Position(j, i));

                            if (!moves.Contains(currentMove))
                            {
                                moves.Add(currentMove);
                            }
                        }

                        if (i < size - 1 && cells[j][i + 1].Type == previous)
                        {
                            Combination currentMove = new Combination();

                            currentMove.combination.Add(new Position(j, i + 1));
                            currentMove.combination.Add(new Position(j, i));

                            if (!moves.Contains(currentMove))
                            {
                                moves.Add(currentMove);
                            }
                        }
                    }

                    previous = cells[j][i].Type;
                }
            }

            return(moves);
        }