MH-SudokuSolver ver 4 Implementation Issues

1) Evaluation of true / false

When I applied the C code as is in C#, Visual Studio would show errors:

Operator && cannot be applied to operands of type 'int' and 'int'

Operator || cannot be applied to operands of type 'int' and 'int'

Operator '!' canot be applied to operand of type 'int'

In C, zero is false; so you could use positive values of scalars or expressions to test for true in conditional (if) and iterative statements (do, while, for).

So code like

if (!(x%4 && y%4))

becomes

if ((x%4 == 0) && (y%4 == 0))

Some more examples:

if (!box[i][ j] && !poss[i][ j])

becomes

if ((box[i, j] == 0) && (poss[i, j] == 0))

Similarly,

            do
            {
                success = 0;
                ................
            } while (success);

 becomes

            do
            {
                success = 0;
                ..................
           } while (success > 0);

 

2) The dreaded exit

In the C program, there is the following code:

int try_obvious (void)
{
  int i, j, k, success;

  if (Nsolved == 81)
  {
      sols++;
      ..............
      ..............
      exit (0);
  }
  ..........
}

if FIRST_SOLUTION_OK is true, exit is called which stops the program. Function try_obvious is called from function solve_it. solve_it calls it recursively, and when the above code is hit, irrespective of the depth of recursion, the program just stops.

What are the constraints in C# ? Firstly, there is no exit. At least I did not find it. Secondly, MH-Sudoku Solver is a visual program, so the exit has to be to the gui. Thirdly, the C functions were translated to methods in the C# class. 

First, I tried the return statement; the execution returned to the calling method (solve_it), but then the recursive logic continues. I had to return to the method above solve_it i.e. method process_input that calls solve_it, whose return goes to the application GUI.

gui --> process_input --> solve_it --> calls try_obvious and then itself recursively

I tried setting a few variables and checking for them, but since the method was in recursion, it did not work.

Next, I considered goto, however, goto transfers control only within the lexical scope (same method), but not to a label in another method.

As I was working, at one point it flashed to me that I should be using exceptions which allows us to transfer execution control to the catch block. The C# code I came up with is:

            if (Nsolved == 81)
            {
                sols++;
                // exit is called in the original C program
                throw new SudokuSolvedException();
            }
In process_input method, I catch the exception

            try
            {
                solve_it(0);
            }
            catch (SudokuSolvedException sse)
            {
                .......................
                return;
            }

This is not an exception (an error occured), but a success condition and the exception handling mechanism is used to get out of the recursion and exit to the gui. Thus, exception handling is used as a glorified goto.

Back          Home

Comments