Nota: trata-se do quebra-cabeça padrão do sudoku 9x9. A solução precisa apenas suportar quebra-cabeças legais resolvidos . Portanto, uma solução não precisa suportar células vazias e pode confiar nas propriedades de um quebra-cabeça sudoku resolvido.
Eu estava pensando isso, mas não conseguia pensar em uma resposta com a qual me contentasse. Uma solução ingênua usaria um byte para cada célula (81 células), totalizando 648 bits. Uma solução mais sofisticada armazenaria todo o quebra-cabeça do sudoku em um número de base 9 (um dígito por célula) e exigiria bits.
Mas ainda pode ser aprimorado, por exemplo, se você souber 8 dos 9 números em uma sub-grade 3x3, poderá deduzir trivialmente o 9º. Você pode continuar com esses pensamentos até o ponto em que essa pergunta se resume a Qual é a quantidade de sudokus resolvidos únicos? Agora você pode usar uma enorme tabela de pesquisa que mapeia cada número binário para um quebra-cabeça sudoku, mas isso não seria uma solução utilizável.
Então, minha pergunta:
Sem usar uma tabela de pesquisa, qual é a quantidade mínima de bits necessária para armazenar um quebra-cabeça sudoku e com qual algoritmo?
fonte
Respostas:
Na mesma linha da resposta da catraca, se você preencher as células não estreladas na matriz a seguir, uma caixa 3x3 de cada vez, sempre escolhendo a próxima caixa a ser preenchida por uma que compartilhe linhas ou colunas com uma caixa que você já preenchido, você obtém um padrão como o seguinte para o número de opções por etapa (preenchendo a caixa do meio superior primeiro, a caixa do canto superior direito, etc.).
Em cada caixa 3x3 após a primeira, depois de preencher uma linha ou coluna da caixa, três dos seis dígitos restantes são localizados em uma única linha. Escolha seus locais primeiro e preencha as três células restantes. (Portanto, a ordem real de quais células preencher pode variar dependendo do que você já sabe, mas o número de opções nunca é maior do que o que mostrei.)
Depois de preencher essas células, todas as estrelas são determinadas.
Se eu calculei corretamente, isso fornece 87 bits. Há algumas economias adicionais a serem obtidas no último bloco 3x3, de acordo com o comentário de Peter Shor: todo valor é localizado em uma das quatro células e cada linha contém pelo menos uma célula com apenas quatro valores possíveis, portanto, certamente os fatores nesse O bloco deve começar com 4 e não 6, mas não entendo os fatores restantes na resposta de Shor.
fonte
6 5 4 4 3 2 3 2 1
acredito que seja6 5 4 6 5 4 3 2 1
o pior caso.continuando com a resposta de @ Peter, aqui está uma lista de piores possibilidades para cada célula, à medida que você a preenche a partir do canto superior esquerdo
isso contribui para 4.24559E + 29 posibilidades ou 99 bits
editar: esqueceu que o último quadrado é totalmente determinado por todos os outros
fonte
Você não precisa de uma tabela de consulta completa para obter uma compressibilidade ideal. Acredito que os computadores modernos que usam uma tabela de consulta bastante razoável possam contar o número de Sudokus restritos , que são Sudokus com alguns dígitos já existentes. Usando isso, veja como você codifica (a decodificação é semelhante).
Corrija uma ordem dos quadrados. Suponha que o número no primeiro quadrado seja . Coloque N 1 como o número de Sudokus cujo primeiro quadrado é menor que d 1 . Seja agora d 2 o número do segundo quadrado. Coloque N 2 como o número de Sudokus cujo primeiro quadrado é d 1 e cujo segundo quadrado é menor que d 2 . E assim por diante. O número codificado é N = Σ i N i .d1 N1 d1 d2 N2 d1 d2 N= ∑EuNEu
Este método de codificação é conhecido como codificação binomial na literatura. Isso deve permitir que você efetivamente (no sentido do mundo real) calcule o índice de qualquer Sudoku e vice-versa. Você precisará de apenas bits, conforme mencionado acima (isso significa que você pode codificar vários deles com esse número médio de bits).72,4
Edit: A página da Wikipedia sobre matemática do Sudoku nos ajuda a esclarecer a imagem. Também é útil uma tabela compilada por Ed Russell .
Acontece que, se você considerar apenas as três principais linhas, haverá essencialmente apenas 44 configurações diferentes a serem consideradas. Na tabela, você pode encontrar o número total de configurações equivalente a qualquer uma delas (assumindo que a linha superior seja 123456789) e o número total de conclusões de cada uma. Dado um Sudoku, eis como calcularíamos seu número ordinal:
Este procedimento é reversível e gerará um Sudoku a partir de um número ordinal. Observe que a enumeração do Sudoku foi reduzida para alguns minutos (em 2006; veja a página de discussão do artigo da Wikipedia) ou menos; portanto, espero que em um computador moderno essa abordagem seja muito prática e demore alguns segundos ou menos.
fonte
Aqui está um algoritmo que eu suspeito que produzirá uma codificação muito boa. Você tem o sudoku finalizado que deseja compactar e digamos que já codificou algumas células dele, então há um sudoku parcial (não necessariamente com uma solução exclusiva) com algumas células preenchidas.
Use um algoritmo fixo para contar quantos números podem ser colocados em cada célula vazia. Encontre a primeira célula lexicograficamente na qual o menor número de números diferentes pode ser colocado e codifique qual desses números entra nela (portanto, se uma célula puder conter apenas 3, 7 ou 9, os 3 serão codificados por "0 ", o 7 por" 1 "e o 9 por" 2 "). Codifique a sequência resultante usando codificação aritmética (que leva em consideração o número de números possíveis que uma célula pode conter).
Não sei quanto tempo durará a sequência binária resultante, mas suspeito que seja muito curta, especialmente se o seu algoritmo para contar quantos números podem ser colocados em uma célula for razoavelmente sofisticado.
Se você tivesse um bom algoritmo que estimasse a probabilidade de cada célula contendo um determinado número, poderia fazer ainda melhor.
fonte
Comentários e críticas são bem-vindos
1.) Armazenar o quebra-cabeça implica armazenar a solução (informações teoricamente).
fonte
Isso é para relatar uma implementação da codificação compacta completa do sudoku (semelhante à sugestão de Zurui Wang 14/09/11).
A entrada é a linha superior e os 3 primeiros dígitos da 2ª linha. Estes são reduzidos para 1-9! e 1-120 e combinados com <= 4,4x10 ^ 7. Eles são usados como dados para contar lexicograficamente todos os sukokus parciais de 30 dígitos até a sequência correspondente. A contagem final até os 81 dígitos inteiros é feita da mesma maneira. Essas três sequências são armazenadas como números inteiros de 32 bits, com no máximo 26 bits, para que possam ser compactadas ainda mais. Todo o processo leva cerca de 3 minutos, com os primeiros 30 dígitos levando a maior parte do tempo. A decodificação é semelhante - exceto as contagens correspondentes, em vez do sudokus.
Em breve - a revisão inclui os 3 primeiros dígitos da 2ª linha na enumeração de 30 dígitos (código de 2 bits), comparações com a enumeração Jarvis (Jscott, 3/1615)
fonte
Eu iria com a seguinte análise simples:
Cada valor pode ser armazenado em 4 bits (varia de 1 a 9, esses três bits permitem até 0 a 16)
Eu acho que eu poderia reduzi-lo para:
Onde
Edit: Neo Style: Conheço Latex.
fonte
Esse número é diferente para cada Sudoku. Uma das regras do Sudoku é que ele tem exatamente uma solução.
Portanto, se você olhar um exemplo, é a quantidade mínima de dados que você deve armazenar.
Se você trabalha do lado oposto, pode remover dígito por dígito e executar um solucionador no resultado para ver se ele ainda possui exatamente uma solução. Nesse caso, você pode excluir outro dígito. Caso contrário, você deve restaurar esse dígito e tentar outro. Se você não pode, você encontrou um mínimo.
Como a maioria dos quebra-cabeças começa quase vazia, uma codificação de duração da execução provavelmente produzirá bons resultados.
fonte