Estude este código cuidadosamente e descubra uma maneira inteligente de usar a recursão para resolver esses complicados quebra-cabeças de sudoku.

Sudoku é um popular quebra-cabeça numérico que consiste em uma grade 9x9 com dígitos de 1 a 9. O quebra-cabeça inclui uma combinação de números e alguns espaços vazios, que você precisa preencher.

Ao preencher os espaços vazios, cada linha, coluna e subgrade 3x3 deve conter todos os dígitos de 1 a 9.

Um script Python simples pode ajudar a resolver um quebra-cabeça de Sudoku para você. Ele pode analisar todos os espaços vazios no tabuleiro de Sudoku e encontrar um número possível para preencher cada espaço em branco.

Como criar e exibir o tabuleiro de Sudoku

Dentro de um script Python, você precisará usar uma lista de arrays para armazenar os valores do quebra-cabeça Sudoku não resolvido.

O código utilizado neste projeto está disponível neste repositório GitHub sob a licença do MIT.

  1. Dentro de um novo script Python chamado sudoku.py, armazene todos os valores para a grade 9x9. Cada linha e coluna representa os nove números do quebra-cabeça Sudoku. Adicione 0s para representar os espaços que precisam ser resolvidos:
    instagram viewer
    placa = [
    [5, 3, 0, 0, 7, 0, 0, 0, 0],
    [6, 0, 0, 1, 9, 5, 0, 0, 0],
    [0, 9, 8, 0, 0, 0, 0, 6, 0],
    [8, 0, 0, 0, 6, 0, 0, 0, 3],
    [4, 0, 0, 8, 0, 3, 0, 0, 1],
    [7, 0, 0, 0, 2, 0, 0, 0, 6],
    [0, 6, 0, 0, 0, 0, 2, 8, 0],
    [0, 0, 0, 4, 1, 9, 0, 0, 5],
    [0, 0, 0, 0, 8, 0, 0, 7, 9]
    ]
  2. Dentro de uma nova função chamada print_board, usar um loop for para processar cada linha na grade:
    defprint_board(quadro):
    para linha em faixa(9):
  3. Para separar cada linha em terços, verifique se a linha é divisível por três e adicione uma linha:
    se linha % 3 == 0e fila != 0:
    imprimir("- - - - - - - - - - - - - - ")
  4. Dentro de cada linha, percorra cada coluna. Você também pode dividir colunas em terços verificando se a coluna é divisível por três:
    para col em faixa(9):
    se col % 3 == 0e col != 0:
    imprimir(" | ", fim="")
  5. Imprima o valor do número armazenado na grade. Se a coluna for a última coluna dessa linha específica, adicione uma linha de quebra, para que a seguinte linha apareça em uma nova linha:
    se col == 8:
    imprimir (tabuleiro[linha][coluna])
    outro:
    print (str (tabuleiro[linha][coluna]) + " ", fim="")
  6. Chame a função para imprimir a placa:
    print_board (placa)
  7. Em uma linha de comando, navegue até a pasta onde você armazenou seu script python, por exemplo:
    área de trabalho cd
  8. Use o comando python para executar seu script Sudoku. Veja o quebra-cabeça impresso na tela:
    python sudoku.py

Como identificar os espaços vazios para resolver

Você pode percorrer as listas para encontrar os espaços que consistem em 0s. Estes determinam quais espaços precisavam ser resolvidos.

  1. Em uma nova função chamada find_empty(), percorra cada linha e coluna no quadro:
    defencontrar_vazio(quadro):
    para linha em faixa(9):
    para col em faixa(9):
  2. Se o valor da célula atual for 0, retorne a posição atual da célula vazia:
    se quadro[fila][coluna] == 0:
    retornar (linha, coluna)
  3. Se o script atingir o final da função, isso significa que o script não encontrou nenhuma célula com o valor 0. Nesse caso, não retorne nada:
    retornarNenhum
  4. Em uma nova função chamada solve(), use a função find para encontrar o primeiro espaço vazio no tabuleiro:
    defresolver(quadro):
    encontrar = encontrar_vazio (tabuleiro)
  5. A função find_empty() retorna a posição da célula em formato de tupla, por exemplo, (0, 2). Salve esses valores separadamente no linha e col variáveis. Caso contrário, retorne true para indicar que não há espaços vazios para resolver:
    senão encontrar:
    retornarVerdadeiro
    outro:
    linha, coluna = encontrar

Como resolver o quebra-cabeça para cada linha, coluna e grade 3x3

Agora que você pode identificar o primeiro espaço vazio a ser resolvido, você precisará tentar encontrar um número apropriado para preencher esse espaço e resolver o quebra-cabeça.

Usando recursão, chame a função solve() dentro dela mesma para tentar todas as combinações possíveis de valores para todos os outros espaços também.

  1. Dentro da função solve(), depois de encontrar o primeiro espaço vazio, percorra cada número de 1 a 9. Esses números representam os números possíveis que poderiam preencher o espaço não resolvido:
    para num em faixa(1, 10):
  2. Insira o tabuleiro, o número possível e a posição da célula vazia em uma nova função. A nova função retornará true se esse número for um número válido que possa resolver esse espaço vazio. Se for válido, atribua esse número à célula do quadro:
    se is_valid (board, num, (row, col)):
    tabuleiro[linha][coluna] = num
  3. Crie a função is_valid(), com parâmetros correspondentes:
    defé válido(tabuleiro, num, pos):
  4. Use a função para verificar se colocar o número naquela posição viola alguma regra do jogo Sudoku. Primeiro, verifique se esse número já existe na linha ou coluna da célula:
    para col em faixa(9):
    se tabuleiro[pos[0]][col] == num e pos[1] != col:
    retornarFalso

    para linha em faixa(9):
    se quadro[linha][pos[1]] == num e pos[0] != linha:
    retornarFalso

  5. Obtenha a grade 3x3 à qual a célula pertence. Você pode fazer isso dividindo a posição da célula por três:
     linha_caixa = pos[0] // 3
    box_col = pos[1] // 3
  6. Para cada linha e coluna nessa grade 3x3, verifique se o número já existe. Em caso afirmativo, retorne false:
    para linha em intervalo (box_row*3, linha_caixa*3 + 3):
    para col em intervalo (box_col*3, box_col*3 + 3):
    se tabuleiro[linha][col] == num e (linha, coluna) != pos:
    retornarFalso
  7. Se o script atingir o final da função, isso significa que nenhuma das regras do Sudoku falhou. Retorno verdadeiro:
    retornarVerdadeiro
  8. A função is_valid() apenas verifica se o posicionamento do número é válido, mas isso não significa que seja a resposta correta para a solução geral. Dentro da função solve(), chame a função solve() novamente com a placa atualizada. A função solve() pode atingir um estado em que não pode mais usar números para preencher espaços. Nesse caso, toda a função retorna falso, redefine essa célula específica de volta para 0 e retrocede. A função solve() só retorna true quando o script pode preencher todos os espaços:
    para num em faixa(1, 10):
    se is_valid (board, num, (row, col)):
    tabuleiro[linha][coluna] = num

    se resolver (tabela):
    retornarVerdadeiro

    quadro[linha][coluna] = 0

    retornarFalso

  9. Para começar a resolver o quebra-cabeça, chame a função solve() com o tabuleiro original, na parte inferior do script, após declarar a função solve():
    resolver (tabela)
  10. Imprima o resultado final:
    imprimir("Resolvido:")
    print_board (placa)
  11. Na linha de comando, use o comando python para executar novamente o script. Veja o quebra-cabeça resolvido impresso na tela:
    python sudoku.py

Criando jogos usando Python

Sudoku é apenas um dos muitos jogos que você pode criar e resolver usando Python. Você pode usar o Python para criar vários outros jogos, como uma confusão de palavras, um jogo de aventura baseado em texto ou um jogo de cores, para citar apenas alguns.