private void setIdentifier(PizzaSlice slice, int id) { for (int r = slice.StartRow; r <= slice.EndRow; r++) { for (int c = slice.StartColumn; c <= slice.EndColumn; c++) { CutCells[r, c] = id; } } }
private bool RegisterCurrentSlice(PizzaSlice slice) { sliceHash.Add(slice.ID, slice); setIdentifier(slice, CurrentSliceID); CurrentSliceID++; CurrentStartColumn = slice.EndColumn + 1; if (slice.EndColumn == Columns - 1 || CutCells[CurrentStartRow, CurrentStartColumn] != 0) { for (int i = 0; i < Rows; i++) { for (int j = 0; j < Columns; j++) { if (CutCells[i, j] == 0) { CurrentStartRow = i; CurrentStartColumn = j; return(true); } } } return(false); } if (slice.EndRow == Rows - 1) { int notCutCells = 0; for (int i = 0; i < Rows; i++) { for (int j = 0; j < Columns; j++) { if (CutCells[i, j] == 0) { notCutCells++; } } } if (notCutCells < 2 * MinIngredientPerSlice) { for (int i = 0; i < Rows; i++) { for (int j = 0; j < Columns; j++) { if (CutCells[i, j] == 0) { Cells[i, j] = -1; } } } return(false); } } return(true); }
public void Cut(int maxBackCount) { //using (StreamWriter sw = new StreamWriter("../../input/log" + DateTime.Now.ToString("MM-ddTHH-mm-ss"))) //{ PizzaSlice cutSlice = null; bool isNotEnd = true; while (isNotEnd) { cutSlice = CutOneSlice(); if (cutSlice != null) { //sw.Write(cutSlice); //sw.WriteLine(); isNotEnd = RegisterCurrentSlice(cutSlice); } else if (isDesertZone) { //sw.Write("Desert zone ------- [" + CurrentStartRow + "][" + CurrentStartColumn + "]"); //sw.WriteLine(); Cells[CurrentStartRow, CurrentStartColumn] = -1; isDesertZone = false; continue; } else { //sw.Write("Recut the slice of ID " + CurrentSliceID + " From Left Neigbour -------"); //sw.WriteLine(); cutSlice = RecutFromTheAboveSlice(Direction.LEFT); if (cutSlice == null) { RecoverAboveSlices(); //sw.Write("Recut the slice of ID " + CurrentSliceID + " From Top Neigbour -------"); //sw.WriteLine(); cutSlice = RecutFromTheAboveSlice(Direction.TOP); } if (cutSlice == null) { RecoverAboveSlices(); //sw.Write("Recut the slice of ID " + CurrentSliceID + " From Right Neigbour -------"); //sw.WriteLine(); cutSlice = RecutFromTheAboveSlice(Direction.RIGHT); } if (cutSlice != null) { //sw.Write(cutSlice); //sw.WriteLine(); isNotEnd = RegisterCurrentSlice(cutSlice); } else { RecoverAboveSlices(); int count = 0; while (cutSlice == null && count < maxBackCount) { //sw.Write("Recut the slice of ID " + CurrentSliceID + " From N-1 -------"); //sw.WriteLine(); cutSlice = RecutFromTheAboveSlice(Direction.MINUS_ONE); count++; } if (count >= maxBackCount) { isDesertZone = true; isNotEnd = true; } else { //sw.Write(cutSlice); //sw.WriteLine(); isNotEnd = RegisterCurrentSlice(cutSlice); } } } } //} }