public SudokuSolver(SudokuGrid grid)
        {
            if (grid == null)
                throw new ArgumentNullException();

            _grid = new SudokuGrid(grid);
        }
        public Cell(SudokuGrid grid, int x, int y)
        {
            if (x < 0 || x > 8 || y < 0 || y > 8)
                throw new IndexOutOfRangeException();

            _grid = grid;
            _x = x;
            _y = y;
            _value = null;
        }
        static void Main(string[] args)
        {
            int?[] grid = {5,3,null,null,7,null,null,null,null,
                           6, null,null,1,9,5,null,null,null,
                           null,9,8,null,null,null,null,6,null,
                           8,null,null,null,6,null,null,null,3,
                           4,null,null,8,null,3,null,null,1,
                           7,null,null,null,2,null,null,null,6,
                           null,6,null,null,null,null,2,8,null,
                           null,null,null,4,1,9,null,null,5,
                           null,null,null,null,8,null,null,7,9};
            SudokuGrid grid2 = new SudokuGrid(grid);
            SudokuSolver solver = new SudokuSolver(grid2);

            Console.WriteLine(solver.solve());

            Console.ReadLine();
        }
        public SudokuGrid(SudokuGrid grid)
        {
            if (grid == null)
                throw new ArgumentNullException();

            _cells = new List<Cell>(9 * 9);

            for (int x = 0; x < 9; x++)
            {
                for (int y = 0; y < 9; y++)
                {
                    Cell cell = new Cell(this, grid.Get(x, y).Value, x, y);
                    _cells.Add(cell);
                }
            }
        }
 public Cell(SudokuGrid grid, int? value, int x, int y)
     : this(grid, x, y)
 {
     _value = value;
 }