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 20000 days, 20 hours, 56 minutes ago.