F´ısica Computacional
Trabalho P2
Entrega no dia 26/01/2015
Prof. Lu´ıs Fernando de Oliveira
Janeiro/2015
Sum´
ario
1 Implementa¸c˜ao da l´ogica para solu¸c˜ao do jogo Sudoku 1 1.1 Busca e elimina¸c˜ao de c´elulas dispon´ıveis . . . 1 1.2 Verifica¸c˜ao da condi¸c˜ao de inser¸c˜ao de candidato . . . 4 1.3 Revalida¸c˜ao de c´elulas indispon´ıveis . . . 7
2 Trabalho para ser entregue 8
1
Implementa¸
c˜
ao da l´
ogica para solu¸
c˜
ao do jogo Sudoku
O trabalho a ser executado consiste na implementa¸c˜ao completa do pseudoc´odigo que ´e a solu¸c˜ao do jogo Sudoku apresentado e discutido no in´ıcio do curso.
A l´ogica da solu¸c˜ao foi discutido como aplica¸c˜ao da heur´ıstica e, justos, vislumbramos uma forma concisa de descrevˆe-la.
Agora, com o aux´ılio das estruturas de fun¸c˜ao e subrotina, come¸camos a desenvolver uma l´ogica mais sofisticada. Come¸camos um m´etodo de desenvolvimento chamado de bottom-up. Nesta metodologia, a solu¸c˜ao ´e constru´ıda implementando-se as rotinas mais b´asicas (opera¸c˜oes fundamentais) a partir da l´ogica discutida inicialmente.
1.1
Busca e elimina¸
c˜
ao de c´
elulas dispon´ıveis
Come¸camos implementando trˆes fun¸c˜oes e trˆes subrotinas onde buscamos um candidato, previamente escolhido, na submatriz, linha e coluna. Caso seja constatada a presen¸ca do can-didato, aplicamos a elimina¸c˜ao das c´elulas dispon´ıveis (elementos da matriz n˜ao preenchidos) marcando-as como indispon´ıveis. O c´odigo combinado para indicar c´elula dispon´ıvel e indis-pon´ıvel foi:
• c´elula dispon´ıvel: preenchida com 0;
• c´elula indispon´ıvel: preenchida com -1.
As subrotinas de elimina¸c˜ao de c´elulas dispon´ıveis simplesmente marcam as c´elulas dis-pon´ıveis como indisdis-pon´ıveis dentro dos respectivos espa¸cos de busca usando o c´odigo sugerido acima.
A´ı v˜ao os pseudoc´odigos das fun¸c˜oes e subrotinas elaboradas em sala de aula:
Func¸˜ao BuscaCandidatoSubmatriz (mat, lin, col, candidato) Retorna (presente)
{Declara¸c˜oes de argumentos}
1. declarar lin, col, candidato num´ericos por c´opia 2. declarar mat[9,9]num´erico por c´opia
3. declarar presente l´ogico
{Declara¸c˜oes de vari´aveis locais}
4. declarar l, c num´ericos
{L´ogica da busca}
5. presente←f also
6. para l de 0 at´e 2 , fazer 7. para cde 0 at´e 2 , fazer
8. se (mat[lin+l, col+c] =candidato),ent˜ao {Se candidato presente...} 9. presente←verdadeiro
10. fim se
11. fim para 12.fim para
13.retornar presente
Fim func¸˜ao
Func¸˜ao BuscaCandidatoLinha (mat, lin, candidato) Retorna (presente)
{Declara¸c˜oes de argumentos}
1. declarar lin, candidato num´ericos por c´opia 2. declarar mat[9,9]num´erico por c´opia 3. declarar presente l´ogico
{Declara¸c˜oes de vari´aveis locais}
4. declarar c num´erico
{L´ogica da busca}
5. presente←f also
6. para c de 1 at´e 9 , fazer
7. se (mat[lin, c] =candidato),ent˜ao 8. presente←verdadeiro
9. fim se
10.fim para
11.retornar presente
Func¸˜ao BuscaCandidatoColuna (mat, col, candidato)Retorna (presente)
{Declara¸c˜oes de argumentos}
1. declarar col, candidato num´ericos por c´opia 2. declarar mat[9,9]num´erico por c´opia 3. declarar presente l´ogico
{Declara¸c˜oes de vari´aveis locais}
4. declarar l num´erico
{L´ogica da busca}
5. presente←f also
6. para l de 1 at´e 9 , fazer
7. se (mat[l, col] =candidato), ent˜ao 8. presente←verdadeiro
9. fim se 10.fim para
11.retornar presente
Fim func¸˜ao
Subrotina EliminaVaziosSubmatriz (mat, lin, col)
{Declara¸c˜oes de argumentos}
1. declarar lin, col num´ericos por c´opia 2. declarar mat[9,9]num´erico por referˆencia
{Declara¸c˜oes de vari´aveis locais}
3. declarar l, c num´ericos
{L´ogica da troca de v´alido para inv´alido}
4. para l de 0 at´e 2 , fazer 5. para cde 0 at´e 2 , fazer
6. se (mat[lin+l, col+c] = 0), ent˜ao {se elemento est´a vazio...} 7. mat[lin+l, col+c]← −1 {marcar como inv´alido}
8. fim se
9. fim para
10.fim para
Fim subrotina
Subrotina EliminaVaziosLinha (mat, lin)
{Declara¸c˜oes de argumentos}
1. declarar lin num´ericos por c´opia
{Declara¸c˜oes de vari´aveis locais}
3. declarar c num´erico
{L´ogica da troca de v´alido para inv´alido}
4. para c de 1 at´e 9 , fazer
5. se (mat[lin, c] = 0), ent˜ao {se elemento est´a vazio...} 6. mat[lin, c]← −1 {marcar como inv´alido}
7. fim se 8. fim para
Fim subrotina
Subrotina EliminaVaziosColuna (mat, col)
{Declara¸c˜oes de argumentos}
1. declarar col num´ericos por c´opia
2. declarar mat[9,9]num´erico por referˆencia
{Declara¸c˜oes de vari´aveis locais}
3. declarar l num´erico
{L´ogica da troca de v´alido para inv´alido}
4. para l de 1 at´e 9 , fazer
5. se (mat[l, col] = 0), ent˜ao {se elemento est´a vazio...} 6. mat[l, col]← −1 {marcar como inv´alido}
7. fim se
8. fim para
Fim subrotina
1.2
Verifica¸
c˜
ao da condi¸
c˜
ao de inser¸
c˜
ao de candidato
Depois do processamento da matriz para um candidato espec´ıfico, o passo seguinte ´e buscar submatrizes, linhas e colunas com apenas uma c´elula dispon´ıvel. Esta ´e a condi¸c˜ao para a inser¸c˜ao do candidato no respectivo espa¸co de busca. Para isso, teremos que criar mais algumas l´ogicas. Primeiro, precisamos de um contador de c´elulas dispon´ıveis. Se o total de c´elulas dispon´ıveis for diferente de 1, ent˜ao n˜ao se insere o candidato. Vejamos a l´ogica para o caso de uma submatriz:
1. para cada c´elula do espa¸co de busca
2. se c´elula dispon´ıvel, ent˜ao
(a) incrementar contador de c´elulas dispon´ıveis (b) se contador ´e igual a 1, ent˜ao
A coordenada de uma c´elula na matriz pode ser definida na forma de um registro chamado coord. As componente deste registro ser˜aolin e col. Ent˜ao, vamos definir o registro:
1. definir registro coord
2. declarar lin num´erico {linha da c´elula} 3. declarar col num´erico {coluna da c´elula} 4. fim registro
Aplicando a l´ogica da busca mais a defini¸c˜ao do registro, temos o pseudoc´odigo busca da c´elula vazia:
Func¸˜ao BuscaCelulaVaziaSubmatriz (mat, lin, col) Retorna (posicao)
{Declara¸c˜oes de argumentos}
1. declarar lin, col num´ericos por c´opia 2. declarar mat[9,9]num´erico por c´opia 3. declarar posicao coord
{Declara¸c˜oes de vari´aveis locais}
4. declarar l, c num´ericos 5. declarar contador num´erico
{L´ogica da busca}
6. posicao.lin← −1 {inicia com linha inv´alida} 7. posicao.col ← −1 {inicia com coluna inv´alida} 8. contador←0
9. para l de 0 at´e 2 , fazer 10. para cde 0 at´e 2 , fazer
11. se (mat[lin+l, col+c] = 0), ent˜ao 12. contador←contador+ 1
13. se (contador= 1), ent˜ao
14. posicao.lin←lin+l {copia a linha v´alida} 15. posicao.col←col+c {copia a coluna v´alida}
16. sen˜ao
17. posicao.lin← −1 {volta para linha inv´alida} 18. posicao.col← −1 {volta para coluna inv´alida}
19. fim se
20. fim se
21. fim para
22.fim para
23.retornar posicao
Fim func¸˜ao
Subrotina InsereCandidatoMatriz (mat, posicao, candidato)
{Declara¸c˜oes de argumentos}
1. declarar candidato num´erico por c´opia
2. declarar posicao coord por c´opia {posicao absoluta} 3. declarar mat[9,9]num´erico por referˆencia
4. se (posicao.lin6=−1 e posicao.col6=−1), ent˜ao {se posi¸c˜ao v´alida...} 5. mat[l, col]←candidato {inserir candidato}
6. fim se
Fim subrotina
As rotinas para busca de c´elulas vazias em linha e coluna vem a seguir:
Func¸˜ao BuscaCelulaVaziaLinha (mat, lin) Retorna (posicao)
{Declara¸c˜oes de argumentos}
1. declarar lin num´ericos por c´opia 2. declarar mat[9,9]num´erico por c´opia 3. declarar posicao coord
{Declara¸c˜oes de vari´aveis locais}
4. declarar c num´erico
5. declarar contador num´erico
{L´ogica da busca}
6. posicao.lin← −1 {inicia com linha inv´alida} 7. posicao.col ← −1 {inicia com coluna inv´alida} 8. contador←0
9. para c de 1 at´e 9 , fazer 10. se (mat[lin, c] = 0), ent˜ao 11. contador←contador+ 1 12. se (contador= 1), ent˜ao
13. posicao.lin←lin {copia a linha v´alida} 14. posicao.col ←c {copia a coluna v´alida} 15. sen˜ao
16. posicao.lin← −1 {volta para linha inv´alida} 17. posicao.col ← −1 {volta para coluna inv´alida}
18. fim se
19. fim se
20.fim para
21.retornar posicao
Fim func¸˜ao
{Declara¸c˜oes de argumentos}
1. declarar col num´ericos por c´opia 2. declarar mat[9,9]num´erico por c´opia 3. declarar posicao coord
{Declara¸c˜oes de vari´aveis locais}
4. declarar l num´erico
5. declarar contador num´erico
{L´ogica da busca}
6. posicao.lin← −1 {inicia com linha inv´alida} 7. posicao.col ← −1 {inicia com coluna inv´alida} 8. contador←0
9. para l de 1 at´e 9 , fazer 10. se (mat[l, col] = 0), ent˜ao 11. contador←contador+ 1 12. se (contador= 1), ent˜ao
13. posicao.lin←l {copia a linha v´alida} 14. posicao.col ←col {copia a coluna v´alida} 15. sen˜ao
16. posicao.lin← −1 {volta para linha inv´alida} 17. posicao.col ← −1 {volta para coluna inv´alida}
18. fim se
19. fim se
20.fim para
21.retornar posicao
Fim func¸˜ao
1.3
Revalida¸
c˜
ao de c´
elulas indispon´ıveis
O fim do processamento de um candidato acontece quando n˜ao h´a mais submatriz, linha ou coluna com uma ´unica c´elula dispon´ıvel para inser¸c˜ao, seja porque todas j´a est˜ao preenchidas seja porque tem sempre mais de uma c´elula dispon´ıvel.
Neste caso, passamos para o candidato seguinte. Mas antes, precisamos desfazer a marca¸c˜ao de c´elulas indispon´ıveis, isto ´e, trocar os valores −1 para 0.
Esta tarefa ´e f´acil como vocˆe ver´a:
Subrotina RevalidaMatriz(mat)
{Declara¸c˜oes de argumentos}
1. declarar mat[9,9]num´erico por referˆencia
{Declara¸c˜oes de vari´aveis locais}
2. declarar l, c num´ericos
3. para l de 1 at´e 9 , fazer 4. para cde 1 at´e 9 , fazer 5. se (mat[l, c] =−1), ent˜ao
7. fim se
8. fim para 9. fim para
Fim subrotina
2
Trabalho para ser entregue
O trabalho a ser entregue ´e a continua¸c˜ao desta l´ogica at´e a l´ogica principal.
N´os, no in´ıcio do curso, discutimos, a partir da heur´ıstica, a l´ogica principal para solu¸c˜ao do jogo. Ent˜ao, a tarefa n˜ao ´e nova; j´a fizemos isso.
A ´unica diferen¸ca ´e que, na ´epoca, n´os partimos da l´ogica principal, sem ter uma no¸c˜ao sobre fun¸c˜oes e subrotinas. Agora, n´os temos estas ferramentas para nos auxiliar.
S´o para refrescar a mem´oria (e oferecer um guia), vou delinear a l´ogica principal sem ser em pseudoc´odigo. A tarefa de vocˆes ´e escrever os pseudoc´odigos.
• para cada candidato de 1 a 9
• fazer as buscas pelo candidato nos espa¸cos de busca
• se o candidato est´a presente, eliminar as c´elulas vazias
• verificar se tem espa¸co de busca com apenas uma c´elula
• se tem, inserir o candidato
Neste cen´ario, vocˆes devem lembrar que, ao se inserir o candidato, pode ser que um outro espa¸co de busca que n˜ao tinha a condi¸c˜ao necess´aria para inser¸c˜ao do candidato se torne apto para a inser¸c˜ao. Ent˜ao, ao se inserir um candidato, vale a pena reprocessar a matriz.
Esta rotina deve ser repetida at´e que n˜ao se tenha mais condi¸c˜oes de se inserir o candidato. A´ı, passamos para o pr´oximo candidato.
Outra observa¸c˜ao feita l´a no in´ıcio do curso ´e que, ao terminar a lista de candidatos, pode ser que a matriz ainda n˜ao tenha sido totalmente preenchida. Ent˜ao, neste caso, devemos reiniciar a lista de candidatos. Este processo deve ser repetido at´e que a matriz esteja totalmente preenchida.
De uma rodada para outra de candidatos, o n´umero de c´elulas dispon´ıveis deve ser sempre menor. Se isso n˜ao acontecer, o jogo “travou”.
Pode acontecer de a solu¸c˜ao ser t˜ao complicada que dependa de um “chute”. Nosso pseu-doc´odigo n˜ao usar´a esta premissa. Ent˜ao, se o jogo empacar, deve-se apresentar uma sa´ıda que diga que o jogo n˜ao tem solu¸c˜ao sem chute e fim.
O trabalho deve ser entregue impresso, folha A4, com cabe¸calho de identifica¸c˜ao (nome, turma, matr´ıcula). Deve ter uma capa.
O trabalho n˜ao pode ter c´opia do que eu j´a fiz aqui neste roteiro (se n˜ao o trabalho n˜ao ´e de vocˆes, mas meu :-( ). O trabalho deve partir do que est´a faltando.
No final, usem um exemplo pr´atico. Escolham uma distribui¸c˜ao de n´umeros iniciais (de uma revista, internet, jornal,...) e apliquem o pseudo c´odigo de vocˆes. Mostrem que ele funciona. Peguem um jogo f´acil.