private static Task <bool> IsValuePossibleAsync(byte[] boardData, int zeroBasedRowIndex, int zeroBasedColumnIndex, byte value) { Board.BoardDataContract(boardData); Board.IndexValidContract(zeroBasedColumnIndex); Board.IndexValidContract(zeroBasedRowIndex); Board.CellValueContract(value); // Note how we run the three tests in parallel. They are independent of each other. var tasks = new Task <bool> [3]; tasks[0] = Task.Run <bool>(() => Board.IsValuePossibleInRow(boardData, zeroBasedRowIndex, value)); tasks[1] = Task.Run <bool>(() => Board.IsValuePossibleInColumn(boardData, zeroBasedColumnIndex, value)); tasks[2] = Task.Run <bool>(() => Board.IsValuePossibleInSquare(boardData, zeroBasedRowIndex, zeroBasedColumnIndex, value)); return(Task.Factory.ContinueWhenAll(tasks, t => t[0].Result && t[1].Result && t[2].Result)); }
/// <summary> /// Internal implementation for setting a cell's value. /// </summary> private static bool TrySetCellInternal(byte[] boardData, int zeroBasedRowIndex, int zeroBasedColumnIndex, byte value) { Board.BoardDataContract(boardData); Board.IndexValidContract(zeroBasedRowIndex); Board.IndexValidContract(zeroBasedColumnIndex); Board.CellValueContract(value, allowZero: false); if (Board.IsValuePossible(boardData, zeroBasedRowIndex, zeroBasedColumnIndex, value)) { boardData[Board.CalculateIndexFromRowAndColumn(zeroBasedRowIndex, zeroBasedColumnIndex)] = value; return(true); } return(false); }
private static bool IsValuePossibleInColumn(byte[] boardData, int zeroBasedColumnIndex, byte value) { Board.BoardDataContract(boardData); Board.IndexValidContract(zeroBasedColumnIndex); Board.CellValueContract(value); for (int i = 0, index = zeroBasedColumnIndex; i < 9; i++, index += 9) { if (boardData[index] == value) { return(false); } } return(true); }
private static bool IsValuePossibleInSquare(byte[] boardData, int zeroBasedRowIndex, int zeroBasedColumnIndex, byte value) { Board.BoardDataContract(boardData); Board.IndexValidContract(zeroBasedColumnIndex); Board.IndexValidContract(zeroBasedRowIndex); Board.CellValueContract(value); for (int r = 0, rowIndex = (zeroBasedRowIndex / 3) * 3; r < 3; r++, rowIndex++) { for (int c = 0, columnIndex = (zeroBasedColumnIndex / 3) * 3; c < 3; c++, columnIndex++) { if (boardData[(rowIndex * 9) + columnIndex] == value) { return(false); } } } return(true); }