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); }
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); }
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); }
public GridObserver(Definition.Grid grid, SeatMode seatMode) : base(grid, seatMode) { this.grid = grid; }
public GridUpdatedEventArgs(Definition.Grid grid) : base(grid.Index, grid) { this.grid = grid; }