constraintSudoku.frink

Download or view constraintSudoku.frink in plain text format


/** This uses Frink's constraint solver to solve a Sudoku problem.
    See constraintSudokuTest.frink for examples of calling it.
*/

class Sudoku
{
   // Any character other than [1-9] can be used for the "placeholder"
   // character.
   class solveFromArray[array] :=
   {
      solver = newJava["frink.constraint.ConstraintSolver"]
      // Make a 2-D array of variables with values 1 to 9.
      q = new array[[9,9], {|row,col,solver| solver.makeIntRangeVariable[1,9]}, solver]
      for row = 0 to 8      // Rows all different
         solver.allDifferent[toVector[q@row]]

      for col = 0 to 8      // Cols all different
         solver.allDifferent[toVector[q.getColumn[col]]]

      for rBlock = 0 to 2   // 3x3 blocks all different
         for cBlock = 0 to 2
         {
            v = newJava["java.util.Vector"]
            for r = 0 to 2
               for c = 0 to 2
                  v.addElement[q@(rBlock*3+r)@(cBlock*3+c)]

            solver.allDifferent[v]
         }

      // Parse input     
      for row=0 to 8
         for col=0 to 8
         {
            c = substrLen[array@row, col, 1]
            if c >= "1" and c <= "9"
               q@row@col.fix[parseInt[c]]
         }
      
      listener = newJava["frink.constraint.GridPrintingSolutionListener", [9,9]]
      //listener.setFirstOnly[true]  // Comment this in to find only one solution.
      solver.solve[listener]      
   }
}


Download or view constraintSudoku.frink in plain text format


This is a program written in the programming language Frink.
For more information, view the Frink Documentation or see More Sample Frink Programs.

Alan Eliasen was born 20145 days, 6 hours, 25 minutes ago.