Solucionador de sudoku

  • 1,179 views
Uploaded on

 

  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Be the first to comment
    Be the first to like this
No Downloads

Views

Total Views
1,179
On Slideshare
0
From Embeds
0
Number of Embeds
0

Actions

Shares
Downloads
6
Comments
0
Likes
0

Embeds 0

No embeds

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
    No notes for slide

Transcript

  • 1. Relatorio de Programacao Solucionador de Sudoku ANDRE LUIZ VITOR DINARDI RODOLFO GOBI ENGENHARIA DE COMPUTACAO 2011/2
  • 2. Objetivo do programaO objetivo do programa e resolver um sudoku dado pelo usuario usando algumas tecnicas simplespara isso.Este programa foi uma interessante escolha pois para faze-lo precisa-se de fazer bastantemanipulacao de matrizes. Para menos problemas na resolucao foi feita uma total modularizacaodo programa, ou seja, dividimos o todo o em partes no qual cada um tinha sua funcao especifica,para isso foram feitas varias funcoes dentro de funcoes ate que fosse obtido o resultado desejado.Matriz tridimensionalO primeiro passo para a solucao foi criar uma matriz tridimensional sudoku[9][9][2] pararepresentar o sudoku, sendo que na posicao sudoku[][][0] foi representado os numerospreenchidos no tabuleiro e na posicao sudoku[][][1] foi representado as possibilidades de umnumero n inteiro preencher as posicoes do tabuleiro. Essa dimensao sudoku[][][1] foi chamada deesqueleto do sudoku pelo fato de nao estar a mostra para o usuario, mas ser a base de toda asolucao.FiltragemO esquelto do sudoku foi criado atraves da principal ideia do jogo: linhas, colunas e regioes semrepetir numeros, entao foi feito uma funcao que faz as filtragens necessarias para o esqueleto dosudoku. Essa funcao verifica para um dado n inteiro a sua presenca nas linhas, colunas e regioes.Quando ocorre a presenca de n essa funcao marca toda linha, coluna ou regiao com o numero 1no esqueleto (sudoku[a][b][1]) querendo dizer que onde tiver marcado com 1 aquele n naopoderia ser preenchido ali (no sudoku[a][b][0]). As posicoes marcadas foram preenchidas com 1 eas demais com 0(zero), ou seja, aonde tinha 0 n poderia entrar e aonde tinha 1 o n nao poderiaentrar.
  • 3. O problema das regioesAs regioes como ja foi dito na apresentacao , sao aqueles quadrados maiores que agrupam 9posicoes.Um dos problemas mais trabalhosos foi a filtragem das possibilidades de preenchimento dosudoku por regioes pois nao seria possivel que o programa pudesse varrer regiao por regiaoverificando a presenca de n. Para resolver o problema foi feito uma funcao que tinha comoparametros de entrada a coordenada (a,b) da posicao e retornava a regiao correspondente a esta.Para complementar, foi criado uma funcao que marcasse completamente toda a regiao que nestivesse presente.AtribuicoesO segundo passo foi criar funcoes que olhem apenas para o esqueleto do sudoku realizando entaoas estrategias para atribuicoes:A primeira estrategia foi verificar a quantidade de possibilidades de n entrar em uma linha,coluna ou regiao. Quando essa quantidade for igual a 1 esse n sera atribuido aquela posicaosudoku[a][b][0]. Por exemplo, ao verificar que o n=3 so pode entrar em uma unica posicao na linhaa, entao n sera atribuido aquela posicao.A segunda estrategia foi fazer uma varredura por todo o sudoku verificando posicao por posicao aquantidade de numeros possiveis de ser preenchidos em cada uma. Por exemplo, se na posicaosudoku[a][b][0] podem entrar os numeros 2,4,7 entao a quantidade de numeros possiveis naposicao sudoku[a][b][0] e igual a 3. Quando essa quantidade for igual a 1 sera evidente que sopode entrar um unico numero ali, entao o programa procura qual seria esse numero possivel n.Quando encontra n, entao o atribui a posicao sudoku[a][b][0].Ponto criticoA unica forma do programa atribuir o numero n a posicao (a,b) ocorre se n nao estiver presentenenhuma vez na linha a , coluna b ou na regiao (a,b).Sobre os metodos usadosEstes metodos usados para resolver sudoku no nosso programa sao os mais basicos possiveis, ouseja, sao metodos que qualquer um com nocoes basicas de como resolver um sudoku usaria.Todo mundo, ao resolver um sudoku de nivel intermediario ou mais dificil chega uma hora que sedepara com uma situacao muito comum: nao sabe mais o que fazer, onde preencher, pois naotem argumentos suficientes para continuar. Para horas como essa existem os metodosavancados. Cada um para uma situacao especifica. Metodos como estes sao de extremadificuldade de entendimento, entao nao foi possivel a implementacao destes no nosso programa.
  • 4. Como nao usamos nenhum desses metodos, o nosso programa nao saberia o que fazer quando sedeparar com uma situacao dessa e entao ele entra em um loop infinito a procura de argumentospara preencher as posicoes que ainda estao vazias , ou seja , quando o assunto e resolver sudoku,esses metodos usados no nosso programa sao insuficientes para todos porem sao eficientes paravarios.Interacao usuario-programaUma ideia que achei interessante de ser feito foi essa interacao e facilidade que o usuario teriacom o programa na hora de digitar todo um sudoku. Entao criei um guia posicao por posicao parao usuario nunca se perder quando estiver digitando. Emplementei tambem um tempo de esperana hora de mostrar o sudoku, ou seja, coloquei o computador para resolver o problema em umtempo que a visao do usuario pudesse acompanhar ao inves de deixar que o computador resolvainstantaneamente.DesempenhoEsse programa fica o tempo todo andando por todas 81 posicoes do sudoku. Uma quantidadeconsideravelmente pequena para um computador. A cada atribuicao sao feitas em media 90verificacoes para garantia de resultados preciso, porem o programa gasta para resolver todo osudoku em media 15 segundos sem a funcao sleep.O programa se preocupou mesmo com o resultado e nao com a velocidade em obte-lo, apesar detudo como vemos o programa esta resolvendo rapidamente.