def _generate_sudoku_map(self): N = 3 field = generate(N) self._is_fail = self._is_game_over = False self._cells_value = [cell for row in field for cell in row] self._solve = [ cell for row in next(solve_sudoku((N, N), field)) for cell in row ] self._const_cells = [bool(cell) for cell in self._cells_value]
def new_sudoku(self): self.matrix, self.sudoku_size = sudoku_generator.gen() self.orig_matrix = copy.deepcopy(self.matrix) # Булевая матрица, описывающая местоположения элементов судоку, которые будут по умолчанию. # Их нельзя редактировать и выглядят внешне по другому self.def_num_matrix = [ [bool(i) for i in row] for row in self.orig_matrix ] # Получим список решения этой судоку self.sudoku_solutions = list(solver.solve_sudoku(self.sudoku_size, copy.deepcopy(self.orig_matrix)))
def gen(): """Функция генерации таблицы судоку.""" example = grid() example.mix() flook = [[0 for j in range(example.n * example.n)] for i in range(example.n * example.n)] iterator = 0 difficult = example.n**4 # Первоначально все элементы на месте if DEBUG: example.show() print("---------------------------") # TODO: Добавить возможность указывать сложность iterator = example.n**4 - 30 while iterator < example.n**4: # Выбираем случайную ячейку i, j = random.randrange(0, example.n * example.n, 1), random.randrange(0, example.n * example.n, 1) if flook[i][j] == 0: # Если её не смотрели iterator += 1 flook[i][j] = 1 # Посмотрим temp = example.table[i][ j] # Сохраним элемент на случай если без него нет решения или их слишком много example.table[i][j] = 0 difficult -= 1 # Усложняем если убрали элемент table_solution = [] for copy_i in range(0, example.n * example.n): table_solution.append( example.table[copy_i][:]) # Скопируем в отдельный список i_solution = 0 for solution in solver.solve_sudoku((example.n, example.n), table_solution): i_solution += 1 # Считаем количество решений if i_solution != 1: # Если решение не одинственное вернуть всё обратно example.table[i][j] = temp difficult += 1 # Облегчаем if DEBUG: example.show() print("difficult = ", difficult) return example.table, (example.n, example.n)
def new_sudoku(self): self.invalid_indexes.clear() self.matrix, self.sudoku_size = sudoku_generator.gen() self.orig_matrix = copy.deepcopy(self.matrix) # Булевая матрица, описывающая местоположения элементов судоку, которые будут по умолчанию. # Их нельзя редактировать и выглядят внешне по другому self.def_num_matrix = [[bool(i) for i in row] for row in self.orig_matrix] # Получим список решения этой судоку self.sudoku_solutions = list( solver.solve_sudoku(self.sudoku_size, copy.deepcopy(self.orig_matrix)))
def gen(): """Функция генерации таблицы судоку.""" example = grid() example.mix() flook = [[0 for j in range(example.n * example.n)] for i in range(example.n * example.n)] iterator = 0 difficult = example.n ** 4 # Первоначально все элементы на месте if DEBUG: example.show() print("---------------------------") # TODO: Добавить возможность указывать сложность iterator = example.n ** 4 - 30 while iterator < example.n ** 4: # Выбираем случайную ячейку i, j = random.randrange(0, example.n * example.n, 1), random.randrange(0, example.n * example.n, 1) if flook[i][j] == 0: # Если её не смотрели iterator += 1 flook[i][j] = 1 # Посмотрим temp = example.table[i][j] # Сохраним элемент на случай если без него нет решения или их слишком много example.table[i][j] = 0 difficult -= 1 # Усложняем если убрали элемент table_solution = [] for copy_i in range(0, example.n * example.n): table_solution.append(example.table[copy_i][:]) # Скопируем в отдельный список i_solution = 0 for solution in solver.solve_sudoku((example.n, example.n), table_solution): i_solution += 1 # Считаем количество решений if i_solution != 1: # Если решение не одинственное вернуть всё обратно example.table[i][j] = temp difficult += 1 # Облегчаем if DEBUG: example.show() print("difficult = ", difficult) return example.table, (example.n, example.n)
def generate(n=3) -> list: """ Функция генерации таблицы судоку. :param n: int - размер базового поля :return: list - готовая таблица """ grid = Grid(n) grid.mix() field_is_look = [[0 for _ in range(grid.n * grid.n)] for _ in range(grid.n * grid.n)] difficult = grid.n**4 # Первоначально все элементы на месте iterator = grid.n**4 - 30 while iterator < grid.n**4: # Выбираем случайную ячейку i, j = randrange(0, grid.n * grid.n, 1), randrange(0, grid.n * grid.n, 1) if field_is_look[i][j] == 0: # Если её не смотрели iterator += 1 field_is_look[i][j] = 1 # Посмотрим temp = grid.table[i][ j] # Сохраним элемент на случай если без него нет решения или их слишком много grid.table[i][j] = 0 # Удаляем элемент difficult -= 1 # Усложняем если убрали элемент table_solution = deepcopy( grid.table) # Скопируем в отдельный список number_of_solution = len( list(solve_sudoku( (grid.n, grid.n), table_solution))) # Считаем количество решений if number_of_solution != 1: # Если решение не одинственное вернуть всё обратно grid.table[i][j] = temp difficult += 1 # Облегчаем return grid.table
def new_sudoku(self): self.matrix, self.sudoku_size = sudoku_generator.gen() self.orig_matrix = copy.deepcopy(self.matrix) # Булевая матрица, описывающая местоположения элементов судоку, которые будут по умолчанию. # Их нельзя редактировать и выглядят внешне по другому self.def_num_matrix = [[bool(i) for i in row] for row in self.orig_matrix] for i in range(len(self.matrix)): for j in range(len(self.matrix[i])): # TODO: сделать матрицу для ячеек cell = self._grid_layout.itemAtPosition(i, j).widget() num = self.matrix[i][j] if num: cell.setText(str(num)) # Получим список решения этой судоку self.sudoku_solutions = list( solver.solve_sudoku(self.sudoku_size, copy.deepcopy(self.orig_matrix)))
def new_sudoku(self): self.matrix, self.sudoku_size = sudoku_generator.gen() self.orig_matrix = copy.deepcopy(self.matrix) # Булевая матрица, описывающая местоположения элементов судоку, которые будут по умолчанию. # Их нельзя редактировать и выглядят внешне по другому self.def_num_matrix = [ [bool(i) for i in row] for row in self.orig_matrix ] for i in range(len(self.matrix)): for j in range(len(self.matrix[i])): # TODO: сделать матрицу для ячеек cell = self._grid_layout.itemAtPosition(i, j).widget() num = self.matrix[i][j] if num: cell.setText(str(num)) # Получим список решения этой судоку self.sudoku_solutions = list(solver.solve_sudoku(self.sudoku_size, copy.deepcopy(self.orig_matrix)))