Ejemplo n.º 1
0
        private bool fillAnyOneElement(Definition.Grid grid)
        {
            bool filled = false;

            Definition.Element emptyElement;
            while (emptyElementHelper.NextEmptyElement(grid, out emptyElement))
            {
                if (fillAnyEmptyElement(grid, emptyElement) && !filled)
                {
                    filled = true;
                }
            }
            return(filled);
        }
Ejemplo n.º 2
0
            public bool NextEmptyElement(Definition.Grid grid, out Definition.Element element)
            {
                if (grid == null)
                {
                    throw new ArgumentNullException("grid");
                }

                element = null;

                int nextIndex = 0;

                lock (this.mapLock)
                {
                    var gridElementMap = this.gridElementMap;
                    if (!gridElementMap.TryGetValue(grid, out nextIndex))
                    {
                        for (int i = 0; i < 9; i++)
                        {
                            var item = grid.Elements[i];
                            if (!item.HasValue)
                            {
                                gridElementMap.Add(grid, i + 1);
                                element = item;
                                return(true);
                            }
                        }
                        return(false);
                    }
                    else
                    {
                        for (int i = nextIndex; i < 9; i++)
                        {
                            var item = grid.Elements[i];
                            if (!item.HasValue)
                            {
                                gridElementMap[grid] = i + 1;
                                element = item;
                                return(true);
                            }
                        }
                        return(false);
                    }
                }
            }
        private void searchAndFill(Definition.Grid grid)
        {
            var currentGridSeatsCount = grid.Elements.SeatCount();

            if (currentGridSeatsCount <= 1)             //fill by OneInNine pattern
            {
                return;
            }

            Definition.Grid grid1InRow, grid2InRow, grid1InColumn, grid2InColumn;
            grid.GetOtherGrids(Definition.LineType.Row, out grid1InRow, out grid2InRow);
            grid.GetOtherGrids(Definition.LineType.Column, out grid1InColumn, out grid2InColumn);

            var currentGridValues      = grid.Elements.Values().ToArray();
            var currentGridSeatIndexes = grid.Elements.NotValued().Select(item => item.Index).ToArray();
            int currentGridIndex       = grid.Index;

            var allElementsInOtherGrid = grid1InRow.Elements
                                         .Concat(grid2InRow.Elements)
                                         .Concat(grid1InColumn.Elements)
                                         .Concat(grid2InColumn.Elements)
                                         .Valued()
                                         .ExceptWithoutDisdinct(item => item.Value, currentGridValues);

            foreach (var group in allElementsInOtherGrid
                     .GroupBy(item => item.Value)
                     .Where(item => item.Count() > 2))
            {
                var preFilledIndexes = group
                                       .SelectMany(item =>
                                                   pretendFillSeatIndex(currentGridIndex, currentGridSeatIndexes, item.GridIndex, item.Index));
                var exceptedSeatIndexes = currentGridSeatIndexes.Except(preFilledIndexes);
                if (exceptedSeatIndexes.Count() == 1)
                {
                    //means only one seat left
                    int exceptedSeatIndex = exceptedSeatIndexes.First();
                    var emptyElement      = grid.Elements[exceptedSeatIndex];
                    var value             = group.Key;
                    filling(emptyElement, value);
                    emptyElement.SetValue(value);
                }
            }
        }
        private void fullRandomGrid(Definition.Grid grid, IEnumerable <int> rndSeq)
        {
            if (grid == null)
            {
                throw new ArgumentNullException("grid");
            }
            if (rndSeq == null)
            {
                throw new ArgumentNullException("rndSeq");
            }

            using (var valueIterator = rndSeq.GetEnumerator())
                using (var elementIterator = grid.Elements.AsEnumerable().GetEnumerator())
                {
                    while (elementIterator.MoveNext() && valueIterator.MoveNext())
                    {
                        elementIterator.Current.SetValue(valueIterator.Current);
                    }
                }
        }
        private bool randomGrid7(Definition.Grid grid1, Definition.Grid grid7, Definition.Grid grid9)
        {
            int index = 0;

            foreach (var element in grid7.Elements)
            {
                int value;
                if (!GetNextElement(grid1.Columns[index % 3].Elements.Cast2()
                                    .Concat(grid9.Rows[index / 3].Elements.Cast2())
                                    .Concat(grid7.Elements.Take(index).Cast2()),
                                    out value))
                {
                    //Console.WriteLine("Cannot get next value at {0}", index + 1);
                    return(false);
                }
                element.SetValue(value);

                index++;
            }

            return(true);
        }
Ejemplo n.º 6
0
        private bool fillAnyEmptyElement(Definition.Grid grid, Definition.Element emptyElement)
        {
            if (emptyElement.HasValue)
            {
                return(false);
            }

            //get two other grids in same row
            Definition.Grid otherGridInRow1, otherGridInRow2;
            grid.GetOtherGrids(Definition.LineType.Row, out otherGridInRow1, out otherGridInRow2);

            //get two other grids in same column
            Definition.Grid otherGridInColumn1, otherGridInColumn2;
            grid.GetOtherGrids(Definition.LineType.Column, out otherGridInColumn1, out otherGridInColumn2);

            int elementIndex    = emptyElement.Index;
            int rowLineIndex    = elementIndex / 3;
            int columnLineIndex = elementIndex % 3;

            var otherGridInRow1Values = otherGridInRow1
                                        .GetElementsInOtherGridLine(rowLineIndex, Definition.LineType.Row)
                                        .Values();
            var otherGridInRow2Values = otherGridInRow2
                                        .GetElementsInOtherGridLine(rowLineIndex, Definition.LineType.Row)
                                        .Values();
            var otherGridInColumn1Values = otherGridInColumn1
                                           .GetElementsInOtherGridLine(columnLineIndex, Definition.LineType.Column)
                                           .Values();
            var otherGridInColumn2Values = otherGridInColumn2
                                           .GetElementsInOtherGridLine(columnLineIndex, Definition.LineType.Column)
                                           .Values();

            var currentElementValues = grid.Elements
                                       .Values();

            var exceptResult = otherGridInRow1Values
                               .Concat(otherGridInRow2Values)
                               .Concat(otherGridInColumn1Values)
                               .Concat(otherGridInColumn2Values)
                               .Except(currentElementValues);

            if (!exceptResult.Any())
            {
                return(false);                //no result
            }
            //get value which appeared both
            var bothOtherElementValues = otherGridInRow1Values
                                         .Intersect(otherGridInRow2Values)
                                         .Intersect(otherGridInColumn1Values)
                                         .Intersect(otherGridInColumn2Values);
            var exactIntersectElementValues = bothOtherElementValues.Intersect(exceptResult);

            int value = exactIntersectElementValues.SingleOrDefault(-1);

            if (value > 0)
            {
                filling(emptyElement, value);
                emptyElement.SetValue(value);
                return(true);
            }
            return(false);
        }
Ejemplo n.º 7
0
 public GridObserver(Definition.Grid grid, SeatMode seatMode)
     : base(grid, seatMode)
 {
     this.grid = grid;
 }
Ejemplo n.º 8
0
 public GridUpdatedEventArgs(Definition.Grid grid)
     : base(grid.Index, grid)
 {
     this.grid = grid;
 }