Next / Previous / Contents / Shipman's homepage

5.16. SudokuSolver.__usedInColumn(): Eliminate digits by column

This routine is structurally very similar to Section 5.15, “SudokuSolver.__usedInRow(): Eliminate digits by row”. The only difference is that we step through the rows of the column containing x, skipping the row containing x.

sudosolver.py
# - - -   S u d o k u S o l v e r . _ _ u s e d I n C o l u m n

    def __usedInColumn ( self, x ):
        """What digits are used elsewhere in the column containing x?

          [ x is an integer in [0,BOARD_L) ->
              return a 9-element bitmap whose elements are true
              iff the corresponding digit is used elsewhere in
              the column containing board position x ]
        """

        #-- 1 --
        # [ rx      :=  the row index of board position x
        #   cx      :=  the column index of board position x
        #   result  :=  a list of MAT_L zeroes ]
        rx, cx  =  self.__xToRowCol ( x )
        result  =  [0] * MAT_L

Again, we skip over cell x so that our result doesn't depend on the state of the cell currently under consideration.

sudosolver.py
        #-- 2 --
        # [ result  :=  result with elements corresponding to
        #       digits found in column cx (except for row rx) ]
        for  row in range(MAT_L):
            #-- 2 body --
            # [ if (row != rx) and
            #   (self has a nonzero value D in cell (rx, col) ->
            #     result[D-1]  :=  1
            #   else ->
            #     I ]
            if  row != rx:
                cell  =  self.get(row, cx)
                if  cell != EMPTY:
                    result[cell-1]  =  1

        #-- 3 --
        return result