• Nenhum resultado encontrado

F´ısica Computacional Trabalho P2 Entrega no dia 26012015

N/A
N/A
Protected

Academic year: 2019

Share "F´ısica Computacional Trabalho P2 Entrega no dia 26012015"

Copied!
8
0
0

Texto

(1)

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¸

ao da l´

ogica para solu¸

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¸

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.

(2)

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 ogico

{Declara¸c˜oes de vari´aveis locais}

4. declarar l, c num´ericos

{L´ogica da busca}

5. presentef 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. presenteverdadeiro

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 ogico

{Declara¸c˜oes de vari´aveis locais}

4. declarar c num´erico

{L´ogica da busca}

5. presentef also

6. para c de 1 at´e 9 , fazer

7. se (mat[lin, c] =candidato),ent˜ao 8. presenteverdadeiro

9. fim se

10.fim para

11.retornar presente

(3)

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 ogico

{Declara¸c˜oes de vari´aveis locais}

4. declarar l num´erico

{L´ogica da busca}

5. presentef also

6. para l de 1 at´e 9 , fazer

7. se (mat[l, col] =candidato), ent˜ao 8. presenteverdadeiro

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

(4)

{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¸

ao da condi¸

ao de inser¸

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

(5)

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. contadorcontador+ 1

13. se (contador= 1), ent˜ao

14. posicao.linlin+l {copia a linha v´alida} 15. posicao.colcol+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

(6)

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. contador0

9. para c de 1 at´e 9 , fazer 10. se (mat[lin, c] = 0), ent˜ao 11. contadorcontador+ 1 12. se (contador= 1), ent˜ao

13. posicao.linlin {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

(7)

{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. contador0

9. para l de 1 at´e 9 , fazer 10. se (mat[l, col] = 0), ent˜ao 11. contadorcontador+ 1 12. se (contador= 1), ent˜ao

13. posicao.linl {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¸

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

(8)

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.

Referências

Documentos relacionados

No relatório Controle da Margem de Contribuição - Família Solventes (anexo 4) verifica-se qual o volume total de faturamento gerado e a rentabilidade da Família Solventes.

Demonstra¸c˜ao. Designamos esse tipo de ponto fixo de n´o repulsivo. Analogamente, se a derivada da fun¸c˜ao F tiver o valor entre 0 e 1, as sequˆencias que come¸carem

Se n˜ ao houver informa¸c˜ ao suficiente para determin´ a-los completamente, diga tudo o que for poss´ıvel com base na informa¸c˜ ao

Ainda que tal número não seja exato, pode-se ter uma idéia da complexidade cultural e lingüística do Brasil indígena, bem como do porquê do tupi ter servido

Logica BCI: IPC( ! )onde cada cancelamento e exactamente de uma hipotese, ou seja, a regra estrutural da contrac~ao n~ao e permitida e os sequents n~ao podem ser vazios a esquerda..

(cocaína, crack, maconha, entre outras) causa dependência, problemas sociais e familiares, perda da capacidade de autorrealização e identidade, efeitos colaterais sérios e o

A principal forma de avaliar os fios multifilamentos con- tínuos é mediante o ensaio de tração, que deve ser realizado em equipamento próprio para ensaio de fios têxteis, o qual

Mas como nós nos encontrávamos todos os anos, para festejar o dia 4 de outubro, que é a data de aniversário do nascimento de Francisco Félix de Souza, nós