def _fill_hidden_singles(self):
        for i in utils.range_(self.side):
            box_i = (i // self.order) * self.order
            for j in utils.range_(self.side):
                box_j = (j // self.order) * self.order
                if self[i][j] > 0:
                    continue
                p = self._possibles[i][j]
                for k in utils.range_(self.side):
                    if k == j:
                        continue
                    p = p.difference(self._possibles[i][k])
                if len(p) == 1:
                    self.set_cell(i, j, p.pop())
                    self.solution_steps.append(self._format_step("HIDDEN-ROW", (i, j), self[i][j]))
                    return True
                p = self._possibles[i][j]
                for k in utils.range_(self.side):
                    if k == i:
                        continue
                    p = p.difference(self._possibles[k][j])
                if len(p) == 1:
                    self.set_cell(i, j, p.pop())
                    self.solution_steps.append(self._format_step("HIDDEN-COL", (i, j), self[i][j]))
                    return True
                p = self._possibles[i][j]
                for k in utils.range_(box_i, box_i + self.order):
                    for kk in utils.range_(box_j, box_j + self.order):
                        if k == i and kk == j:
                            continue
                        p = p.difference(self._possibles[k][kk])
                if len(p) == 1:
                    self.set_cell(i, j, p.pop())
                    self.solution_steps.append(self._format_step("HIDDEN-BOX", (i, j), self[i][j]))
                    return True
        return False