• Nenhum resultado encontrado

ebook-sudoku

N/A
N/A
Protected

Academic year: 2021

Share "ebook-sudoku"

Copied!
24
0
0

Texto

(1)

Sum´

ario

1 L´ogica 2

1.1 M´etodo heur´ıstico . . . 2

1.2 Aplica¸c˜ao do m´etodo: sudoku . . . 4

2 Pr´atica de programa¸c˜ao 14 2.1 Regras da boa programa¸c˜ao . . . 14

2.2 Documenta¸c˜ao externa . . . 15

3 Pseudoc´odigo 18 3.1 Sudoku . . . 18

3.1.1 Contar c´elulas dispon´ıveis . . . 19

3.1.2 Processar submatrizes . . . 19

3.1.3 Processar linhas e colunas . . . 20

3.1.4 Contar c´elulas dispon´ıveis nas linhas e colunas . . . 20

3.1.5 Inserir valor candidato na matriz do jogo . . . 21

3.1.6 Desmarcar c´elulas . . . 21

(2)

M ´odulo

1

ogica

Todos estamos habituados a organizar nossas tarefas di´arias segundo uma lista de coisas “para fazer”. Esta lista di´aria pode ser ordenada na forma de prioridades ou em uma ordem que fa¸ca sentido para o indiv´ıduo. O que se deseja ´e que, no final do dia, tudo tenha sido cumprido. Tamb´em ´e normal, na rotina de um trabalho ou estudo, deparar-se com tarefas que devem ser cumpridas, `as vezes numa mesma ordem, as vezes numa ordem diferente. Algumas rotinas permitem essa flexibilidade, outras n˜ao. Tˆem tarefas que podem ser realizadas simultaneamente, outras n˜ao.

Conforme o indiv´ıduo amadurece e adquire experiˆencia, percebe que algumas tarefas devem ser exe-cutadas numa determinada ordem para que as mesmas sejam conclu´ıdas satisfatoriamente. A experiˆencia ´e um instrumento muito valioso neste processo. Na ausˆencia de experiˆencia, devemos agir com sabedoria. O conhecimento, por vezes o cient´ıfico, se faz valer nestes momentos.

A l´ogica ´e o estudo formal sistem´atico dos princ´ıpios da inferˆencia v´alida e do pensamento correto. J´a que o pensamento ´e a manifesta¸c˜ao do conhecimento, e que o conhecimento busca estabelecer a verdade, ´e preciso a ado¸c˜ao de algumas regras para que essa meta possa ser atingida. Assim, a l´ogica ´e o ramo da filosofia que cuida das regras do bem pensar, ou do pensar correto, sendo, portanto, um instrumento do pensar. Mas a aprendizagem da l´ogica n˜ao constitui um fim em si.

A l´ogica s´o tem sentido enquanto meio de garantir que nosso pensamento proceda corretamente a fim de chegar a conhecimentos verdadeiros. Podemos, ent˜ao, dizer que a l´ogica trata dos argumentos e, consequentemente, das conclus˜oes a que chegamos atrav´es da apresenta¸c˜ao de evidˆencias que a sustentam. Mas qual m´etodo adotar? O desenvolvimento de algoritmos ´e tradicionalmente apresentado como l´ogica de programa¸c˜ao. Esta l´ogica possui caracter´ıstica do m´etodo dedutivo que parte de premissas assumidas como verdadeiras e que, a partir de um racioc´ınio l´ogico dedutivo, ´e capaz de gerar uma conclus˜ao v´alida, assumindo que o processo dedutivo ´e v´alido.

Entretanto, a estrutura formal do m´etodo dedutivo engessa em parte o processo de livre cria¸c˜ao se o indiv´ıduo n˜ao est´a familiarizado com a l´ogica dedutiva. Precede o processo de programa¸c˜ao o processo de cria¸c˜ao que, entre outros elementos, visa estabelecer as estrat´egias a serem usadas na elabora¸c˜ao da solu¸c˜ao do problema.

O contexto da cria¸c˜ao, a gˆenese, ´e o da elabora¸c˜ao mental, muitas vezes n˜ao-linear, mas que, com a experimenta¸c˜ao e a reflex˜ao, cria vieses mais definidos. Por vezes, o processo criativo conduz o de-senvolvedor “`a estaca zero” de onde ele parte novamente em busca de novas solu¸c˜oes. Neste aspecto, a heur´ıstica torna-se um ponto de partida adequado por revelar ao desenvolvedor mecanismos e estrat´egias que organizam seu processo de gˆenese sem esgotar sua capacidade inventiva.

1.1

etodo heur´ıstico

Segundo Polya1apud Rosa e Orey2, a heur´ıstica pode ser compreendida como um conjunto de regras

e m´etodos que conduzem `a descoberta e `a inven¸c˜ao e que s˜ao utilizados na resolu¸c˜ao de problemas. Tem

1POLYA, G. A arte de resolver problemas: um novo aspecto do m´etodo matem´atico. Tradu¸ao de Heitor Lisboa de Ara´ujo.

Rio de Janeiro:Interciˆencia, 1978. 196 p.

2ROSA, M.; OREY, D. C. De Pappus a Polya: da heur´ıstica grega `a resolu¸ao de problemas. p. 12–27, In PLURES –

HUMANIDADES: Revista do Programa de P´os-Gradua¸c˜ao em Educa¸c˜ao - Mestrado, n. 11 – jan./jun. 2009. Ribeir˜ao Preto, SP: Centro Universit´ario Moura Lacerda. Departamento de Educa¸c˜ao e Programa de P´os-Gradua¸c˜ao em Educa¸c˜ao – Mestrado –14,5 x 21cm. 164 p.

(3)

por objetivo compreender as opera¸c˜oes mentais pr´oprias deste processo que se mostrem ´uteis.

Na logica, o m´etodo heur´ıstico antecede, por assim dizer, os m´etodos rigorosos de indu¸c˜ao e dedu¸c˜ao. Enquanto os ´ultimos s˜ao a base do processo de demonstra¸c˜ao e formula¸c˜ao de leis gerais, a heur´ıstica ´e por certo imprecisa e provis´oria e conta com dois elementos caracteristicamente humanos: a intui¸c˜ao e a criatividade. O m´etodo heur´ıstico ´e posto frequentemente como um m´etodo de “tentativa e erro”, que ´e um equ´ıvoco se for considerado que o indiv´ıduo que procura solucionar um problema parte naturalmente de conceitos, modelos e hip´oteses formulados em experiˆencias anteriores.

No entanto, mesmo que a heur´ıstica parta de bases consideradas n˜ao formais, reconhece-se estruturas de inferˆencia similares `as adotadas nos outros m´etodos: o processo de an´alise e de s´ıntese. Polya classifica estes processos segundo as fases do processo mental que o indiv´ıduo aplica na abordagem de um problema e na constru¸c˜ao de sua solu¸c˜ao. O processo de an´alise se divide em compreens˜ao do problema e elabora¸c˜ao de um plano, enquanto a s´ıntese se divide em execu¸c˜ao do plano e revis˜ao da resolu¸c˜ao. O ponto de partida da an´alise ´e o problema e o seu produto ´e o plano de a¸c˜ao. Na s´ıntese, o ponto de partida ´e o plano de a¸c˜ao e o resultado ´e solu¸c˜ao do problema.

Compreens˜ao do problema

A compreens˜ao do problema ´e est´a relacionada `a interpreta¸c˜ao do enunciado. E necess´´ ario a leitura cont´ınua do mesmo at´e que toda informa¸c˜ao poss´ıvel tenha sido identificada. O processo l´ogico se inicia, ent˜ao, com a an´alise da informa¸c˜ao adquirida, a partir da qual o desenvolvedor deve estabelecer suas metas, pois o problema pode ter implica¸c˜oes. ´E importante entender as causa do problema e os efeitos provocados por ela. Al´em disso, mudar o ponto de vista que ´e lan¸cado sobre o problema ajuda tamb´em na explora¸c˜ao dos aspectos mais gerais do problema. Algumas perguntas s˜ao ´uteis nesta epata: Qual ´e o problema? Que informa¸c˜oes tenho? O que est´a faltando? Onde devo chegar? As respostas a estas e outras perguntas n˜ao s˜ao a solu¸c˜ao, mas evidenciam o escopo de trabalho, seus limites e as dire¸c˜oes a serem tomadas. A compreens˜ao do problema deve estar impregnada de quest˜oes e respostas.

Elabora¸c˜ao de um plano

Na elabora¸c˜ao de um plano, o desenvolvedor, j´a de posse das informa¸c˜oes necess´arias at´e o presente momento, ´e capaz de idealizar uma solu¸c˜ao inicial. O processo pode ser longo, mas deve ser finito. Como em um processo de amadurecimento, o desenvolvedor conta com v´arios instrumentos para criar e avaliar poss´ıveis solu¸c˜oes. O uso de diagramas, desenhos, rascunhos e tabelas podem auxili´a-lo a visualizar o plano. Esta fase ´e de alta criatividade e ´e primordial que o desenvolvedor sinta-se livre para compor sua abordagem.

O passo inicial pode ser dif´ıcil, mas uma atitude de perseveran¸ca nesta busca ´e fundamental. A experiˆencia e o bom senso do desenvolvedor s˜ao um bom ponto de partida. Por analogia, compara¸c˜ao e transposi¸c˜ao, ele agrega seu conhecimento `a an´alise do problema e desenvolve uma solu¸c˜ao tempor´aria.

O plano em si ´e um conjunto de a¸c˜oes, sequencialmente organizado, e que dever´a ser executado, na ordem explicitada. ´E como uma receita – se um passo for ignorado, o resultado final poder´a ficar comprometido. Uma boa pr´atica ´e a elabora¸c˜ao das a¸c˜oes usando verbos no modo infinitivo e que cada a¸c˜ao corresponda a um verbo, ou seja, cada passo do plano ´e uma a¸c˜ao e cada a¸c˜ao ´e caracterizado por um verbo. Desta forma, as a¸c˜oes poder˜ao ser facilmente verificadas quanto ao seu efeito e sua validade.

Execu¸c˜ao do plano

A primeira fase da s´ıntese ´e a execu¸c˜ao do plano concebido. Esta etapa ´e menos mental e mais bra¸cal. O desenvolvedor deve seguir cada passo do plano elaborado e conferir se o resultado esperado foi realmente obtido. ´E comum, principalmente nas abordagens iniciais, deparar-se com a necessidade de alterar o plano haja vista alguma incoerˆencia entre os resultados e os objetivos.

(4)

Se for preciso, o desenvolvedor deve retornar para a etapa de compreens˜ao do problema e refazer todo o caminho at´e que o plano gere resultados coerentes com o esperado.

Revis˜ao da resolu¸c˜ao

Pela dinˆamica pr´opria do m´etodo heur´ıstico, a fase final de revis˜ao do processo como um todo propicia ao indiv´ıduo a oportunidade de aperfei¸coamento do plano, reiniciando cada uma das epatas.

Assim, o esquema geral da heur´ıstica se baseia no tr´ıplice conceito an´alise-s´ıntese-avalia¸c˜ao.

Deve se destacar que a heur´ıstica permite que o desenvolvedor retorne a qualquer uma das etapas no momento que isso se justificar. Mas deve ser claro tamb´em que ao voltar, as etapas, a partir do ponto de retorno, dever˜ao ser refeitas.

1.2

Aplica¸

ao do m´

etodo: sudoku

Muitos passatempos se baseiam na elabora¸c˜ao de processos l´ogicos para serem resolvidos. Um, muito interessante (do ponto de vista did´atico), ´e o quebra-cabe¸ca chamado Sudoku. Este jogo consiste em uma matriz 9 × 9 dividida em 9 submatrizes, cada uma de 3 × 3 elementos. A matriz total ´e preenchida parcialmente com n´umeros e o objetivo ´e complet´a-la com n´umeros seguindo as seguintes regras:

Regras

1. os n´umeros dispon´ıveis para preenchimento das submatrizes est˜ao restritos ao intervalo de n´umeros inteiros de 1 a 9;

2. n˜ao pode haver n´umero repetido dentro de uma submatriz espec´ıfica; 3. n˜ao pode haver n´umero repetido em uma coluna espec´ıfica;

4. n˜ao pode haver n´umero repetido em uma linha espec´ıfica. Aplicando a heur´ıstica, o primeiro passo ´e compreender o problema.

No Sudoku, o objetivo ´e encontrar que valor dever´a ser escrito em cada c´elula vazia da matriz de forma a n˜ao violar as regras estabelecidas. Cada exemplar de Sudoku admite somente uma solu¸c˜ao que fica determinada a partir dos n´umeros previamente lan¸cados na matriz como situa¸c˜ao inicial.

O maior dificultador na solu¸c˜ao do jogo est´a no foco da aten¸c˜ao do jogador. As c´elulas devem ser preenchidas com n´umeros no intervalo de 1 a 9 e a matriz de n´umeros apresenta uma quantidade de c´elulas n˜ao preenchidas que dificulta a visualiza¸c˜ao da solu¸c˜ao. Um n´umero candidato inserido na c´elula errada produz uma distribui¸c˜ao equivocada que pode n˜ao ser detectada de imediato. Logo, o jogador segue preenchendo as c´elulas at´e que as regras o impede de prosseguir. Nesta situa¸c˜ao, o jogador precisa voltar e identificar que n´umero foi encaixado erroneamente. Esse m´etodo se torna impratic´avel.

Analisando o problema, percebe-se duas vari´aveis: o n´umero candidato e a posi¸c˜ao onde dever´a ser inscrito. A inscri¸c˜ao de um candidato em uma determinada posi¸c˜ao interfere na distribui¸c˜ao seguinte.

Ent˜ao, para resolver o problema, ´e necess´ario uma estrat´egia que minimize o n´umero de combina¸c˜oes de vari´aveis, buscando, no processamento de cada candidato, determinar a sua posi¸c˜ao definitiva. S´o, ent˜ao, outro candidato poder´a ser processado.

Uma forma de reduzir a dimens˜ao do problema ´e n˜ao tratar todos os candidatos ao mesmo tempo e tirar proveito das regras a favor do jogador.

Primeiro, a partir da distribui¸c˜ao dos n´umeros j´a inscritos, cria-se um mapa de disponibilidades, ou seja, uma matriz onde as c´elulas j´a ocupadas por n´umeros na matriz de n´umeros ser˜ao preenchidas com algum s´ımbolo diferente, por exemplo, ‘X’. A matriz do jogo e o mapa s´o diferem pela presen¸ca de n´umeros e s´ımbolos. As posi¸c˜oes ocupadas em uma s˜ao as mesmas ocupadas na outra.

Depois, usando as regras 2, 3 e 4, o jogador pode marcar as c´elulas no mapa que n˜ao poder˜ao, de antem˜ao, receber o n´umero candidato. Cada n´umero candidato exigir´a um mapa de disponibilidade. Trabalhar com todos os mapas de disponibilidade ao mesmo tempo n˜ao resolve, pois ´e a mesma situa¸c˜ao identificada inicialmente. Ent˜ao, o jogador deve, sistematicamente, resolver cada candidato por vez sendo que o resultado de um processamento ´e o in´ıcio do processamento de outro candidato. No universo de 1 a 9, o jogador pode escolher qualquer n´umero para come¸car. Uma sugest˜ao ´e percorrer a sequˆencia

(5)

num´erica iniciando com o n´umero 1, depois o n´umero 2 e assim por diante.

Ent˜ao, para o n´umero 1, cria-se o mapa de disponibilidade inicial e aplica-se as regras j´a mencionadas. Toda submatriz que contiver o n´umero 1 ter´a suas c´elulas vazias marcadas com o ‘X’. Toda coluna que tiver o n´umero 1 presente ter´a suas c´elulas vazias tamb´em marcadas com o ‘X’. Idem para as linhas que tiverem o n´umero 1. O resultado ´e um mapa onde somente as c´elulas vazias para o n´umero 1 est˜ao dispon´ıveis. Da´ı o nome de mapa de disponibilidades.

O passo seguinte ´e identificar as linhas e as colunas onde h´a somente uma c´elula dispon´ıvel para a inser¸c˜ao do n´umero 1. Se h´a c´elulas dispon´ıveis nesta condi¸c˜ao, ent˜ao o n´umero deve ser inserido. Se n˜ao h´a c´elulas nesta condi¸c˜ao, ent˜ao parte-se para o pr´oximo n´umero candidato, isto ´e, o n´umero 2.

O tratamento para o n´umero 2 ´e idˆentico ao do n´umero 1. A diferen¸ca estar´a no mapa de disponibi-lidades inicial. O mapa para o n´umero 2 ´e gerado a partir da solu¸c˜ao para o n´umero 1 (com o n´umero 1 j´a inserido na matriz de n´umeros do jogo). A cada candidato novo, o mapa de disponibilidades inicial ser´a a solu¸c˜ao do candidato anterior.

Agora j´a ´e poss´ıvel vislumbrar-se um plano. O n´ucleo do processo ´e a an´alise de cada candidato por vez. Para cada candidato, um mapa de disponibilidade ser´a criado e atualizado. Dependendo do grau de dificuldade, ´e poss´ıvel que, ao se esgotar os n´umeros candidatos, ainda se observe c´elulas dispon´ıveis. Ent˜ao o plano deve prever a repeti¸c˜ao da an´alise dos candidatos continuamente. O crit´erio de parada ´e n˜ao haver mais c´elulas dispon´ıveis no momento da cria¸c˜ao do mapa de disponibilidade.

Veja o plano de uma forma mais estruturada:

O plano

Repetir

Para cada n´umero no intervalo de 1 a 9, Iniciar mapa com c´elulas dispon´ıveis

Marcar no mapa as c´elulas j´a ocupadas como indispon´ıveis Se n˜ao houver mais c´elulas dispon´ıveis,

Encerrar processo Sen˜ao

Marcar no mapa as c´elulas que perten¸cam a submatrizes que [j´a tenham o n´umero candidato como indispon´ıveis Marcar no mapa as c´elulas que perten¸cam a uma linha que j´a

[tenha o n´umero candidato como indispon´ıveis

Marcar no mapa as c´elulas que perten¸cam a uma coluna que j´a [tenha o n´umero candidato como indispon´ıveis

Para cada linha que tenha somente uma c´elula dispon´ıvel, Preencher a c´elula da matriz com o n´umero candidato Marcar a c´elula preenchida como indispon´ıvel

Para cada coluna que tenha somente uma c´elula dispon´ıvel, Preencher a c´elula da matriz com o n´umero candidato Marcar a c´elula preenchida como indispon´ıvel

Para examinar a aplica¸c˜ao do plano, considere o seguinte mapa de n´umeros:

7 9 1 3 8 3 4 2 7 1 6 2 5 6 8 2 3 2 4 6 9 2 1 7 5 7 8 7 3 2 6 2 7 6 4 9

(6)

passo ´e tornar indispon´ıvel cada c´elula do mapa de disponibilidade que corresponda a uma c´elula j´a ocupada por um n´umero na matriz do jogo. Para efeito de visualiza¸c˜ao do plano, as c´elulas dispon´ıveis ser˜ao deixadas em branco. As c´elulas indispon´ıveis ser˜ao marcadas com o caractere ‘X’.

7 9 1 3 8 3 4 2 7 1 6 2 5 6 8 2 3 2 4 6 9 2 1 7 5 7 8 7 3 2 6 2 7 6 4 9 X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X

Neste ponto, deve-se avaliar se h´a c´elulas dispon´ıveis no mapa. Se n˜ao houver, ´e porque o jogo terminou e todas as c´elulas na matriz de n´umeros j´a est˜ao preenchidas. Caso contr´ario, o processo continua.

Como h´a c´elulas dispon´ıveis neste exemplo, ent˜ao o quarto passo ser´a marcar como indispon´ıveis as c´elulas contidas em cada submatriz que contenha o n´umero candidato. Neste passo-a-passo, o primeiro n´umero avaliado ´e o 1, primeiro n´umero do intervalo de 1 a 9. As duas submatrizes superiores (central e da direita) e a submatriz central ser˜ao afetadas pela a¸c˜ao.

7 9 1 3 8 3 4 2 7 1 6 2 5 6 8 2 3 2 4 6 9 2 1 7 5 7 8 7 3 2 6 2 7 6 4 9 X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X

No quinto e sexto passos, buscam-se as linhas e colunas da matriz de n´umeros que contenham o n´umero avaliado. As linhas e colunas correspondentes no mapa de disponibilidade dever˜ao ter suas c´elulas dispon´ıveis alteradas para indispon´ıveis. Desta forma, a quarta, sexta e oitava colunas ficar˜ao totalmente indispon´ıveis. A primeira, segunda e sexta linhas, idem.

7 9 1 3 8 3 4 2 7 1 6 2 5 6 8 2 3 2 4 6 9 2 1 7 5 7 8 7 3 2 6 2 7 6 4 9 X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X

(7)

Agora, deve-se avaliar cada linha e cada coluna em busca de linhas e colunas onde no mapa haja somente uma c´elula dispon´ıvel. Uma vez identificadas, o n´umero candidato dever´a ser inscrito no corres-pondente destas c´elulas no mapa de n´umeros e o processo recome¸ca com o pr´oximo n´umero candidato.

Para este exemplo, somente a quinta c´elula da s´etima coluna do mapa de disponibilidade se encaixa na condi¸c˜ao acima. Logo, a quinta c´elula da s´etima coluna da matriz de n´umeros dever´a ser preenchida como o n´umero 1.

A terceira linha tem duas c´elulas dispon´ıveis, n˜ao ´e conclusivo. A quarta linha tamb´em tem duas c´elulas dispon´ıveis, n˜ao conclusivo. A quinta linha tem cinco c´elulas dispon´ıveis, a s´etima tem quatro, a oitava e a ´ultima tem trˆes respectivamente, todas inconclusivas.

Olhando para as colunas, a primeira tem cinco c´elulas dispon´ıveis, n˜ao conclusivo. A segunda tem quatro, a terceira tem trˆes, a quinta tem duas c´elulas dispon´ıveis e a ´ultima coluna tem quatro. Todas inconclusivas.

A matriz de n´umeros a seguir ´e o resultado da execu¸c˜ao inicial do plano. O n´umero 1 inserido est´a destacado em vermelho. 7 9 1 3 8 3 4 2 7 1 6 2 5 6 8 2 3 2 4 1 6 9 2 1 7 5 7 8 7 3 2 6 2 7 6 4 9

Para o n´umero 2, o segundo candidato, a sequˆencia de mapas de disponibilidade ser´a a seguinte: o mapa da esquerda ´e o mapa dos n´umeros j´a presentes; o central ´e o mapa com as submatrizes marcadas pela presen¸ca do n´umero 2; e o da direita ´e o mapa com as linhas e colunas marcadas pa presenta¸ca tamb´em do n´umero 2. X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X

(8)

X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X 2 7 9 1 3 8 3 4 2 7 1 6 2 5 6 8 2 3 2 4 1 6 9 2 1 7 5 7 2 8 7 3 2 6 2 7 6 4 9

Pelo ´ultimo mapa de disponibilidade, somente a primeira c´elula da primeira linha e a ´ultima c´elula da s´etima linha se enquadram na condi¸c˜ao de ´unicas c´elulas dispon´ıveis nas linhas ou colunas. Logo, o n´umero 2 s´o poderia ser inscrito nestas c´elulas no mapa de n´umeros.

O passo seguinte ´e reiniciar o processo para o n´umero 3 com a constru¸c˜ao do mapa de disponibilidade (mapa da esquerda). Depois, o mapa ´e atualizado em fun¸c˜ao da regra 2 (mapa da direita).

X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X

Enfim, as linhas e colunas s˜ao atualizadas pelas regras 3 e 4 (mapa da esquerda). O resultado ´e a matriz de n´umeros (matriz da direita).

X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X 2 7 9 1 3 8 3 4 2 7 1 6 3 2 5 6 8 2 3 2 4 1 6 9 2 1 3 7 5 7 3 2 8 7 3 2 6 3 2 7 6 4 9

(9)

X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X

e para as regras 3 e 4 (esquerda). A matriz de n´umeros ´e exibida a direita com a inser¸c˜ao do n´umero 4.

X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X 2 7 9 1 3 8 4 3 4 2 7 1 6 3 2 5 6 8 2 3 2 4 1 6 9 2 1 3 4 7 5 4 7 3 2 8 7 3 2 6 3 2 7 6 4 9 O processamento do n´umero 5: X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X

(10)

X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X 2 7 9 1 3 8 4 3 4 2 7 1 6 3 2 5 6 8 2 3 2 4 1 6 9 2 1 3 4 7 5 4 7 3 2 8 7 3 2 6 3 2 7 6 4 9

Para este caso, nenhuma das c´elulas dispon´ıveis se enquadrou no teste de isolamento. Logo, o n´umero 5 n˜ao altera a situa¸c˜ao e testa-se o pr´oximo candidato, o 6.

X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X 2 7 9 6 1 3 8 4 3 4 2 7 1 6 6 3 2 5 6 8 2 3 2 4 1 6 6 9 2 1 3 4 7 6 5 4 7 3 2 8 7 3 2 6 3 2 7 6 4 9 Para o n´umero 7:

(11)

X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X 2 7 9 6 1 3 8 4 3 4 2 7 1 6 6 3 2 7 5 7 6 8 2 3 7 2 4 1 6 6 9 2 1 3 4 7 6 5 4 7 3 2 8 7 3 2 6 3 2 7 6 4 9 Para o n´umero 8: X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X 2 7 9 6 1 3 8 4 8 3 4 2 7 1 6 6 3 2 7 5 7 6 8 2 3 7 8 2 4 1 6 6 9 2 1 8 3 4 7 6 5 8 4 7 3 2 8 7 3 2 6 3 2 7 6 4 9 8

(12)

E, finalmente, para o n´umero 9: X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X 2 7 9 6 1 3 8 4 8 3 4 2 7 9 1 6 6 3 2 7 5 9 7 6 8 2 3 7 8 2 4 1 6 6 9 2 1 8 3 4 7 6 5 8 4 7 3 2 9 8 7 3 2 6 3 2 7 6 4 9 8

Pelo plano, a lista de n´umeros candidatos deve ser percorrida novamente j´a que, ao se cumprir a primeira etapa, o mapa de disponibilidades n˜ao ficar´a totalmente preenchida. Ser´a deixado como exerc´ıcio montar o novo conjunto de mapas de disponibilidade para cada candidato at´e que a matriz de n´umeros tenha sido resolvida.

Quanto a reavalia¸c˜ao do plano, pode-se dizer que o plano como est´a j´a ´e uma solu¸c˜ao para o problema, pois resolve o jogo, determinando sistematicamente onde os candidatos dever˜ao ser preenchidos.

No entanto, pode ser melhorado. Nas etapas de an´alise das submatrizes, linhas e colunas, o objetivo ´e destacar quais c´elulas est˜ao isoladamente dispon´ıveis nas linhas e colunas. Pode ser que, ao se inserir o n´umero candidato, c´elulas que foram deixadas como dispon´ıveis se tornem indispon´ıveis pela aplica¸c˜ao da regra 2. Isto implica na elimina¸c˜ao de c´elulas dispon´ıveis dentro das submatrizes que receberam o n´umero candidato e um poss´ıvel isolamento de c´elulas dispon´ıveis em linhas e colunas que antes n˜ao era vis´ıvel.

O aperfei¸coamento no plano poderia ser, ent˜ao, a repeti¸c˜ao dos procedimentos a partir da segunda etapa para o mesmo candidato at´e que mais nenhuma c´elula dispon´ıvel ficasse isolada em uma linha ou coluna.

O plano

Repetir

Para cada n´umero no intervalo de 1 a 9, Iniciar mapa com c´elulas dispon´ıveis

Marcar no mapa as c´elulas j´a ocupadas como indispon´ıveis Se n˜ao houver mais c´elulas dispon´ıveis,

Encerrar processo Sen˜ao

(13)

Marcar no mapa as c´elulas que perten¸cam a submatrizes que [j´a tenham o n´umero candidato como indispon´ıveis Marcar no mapa as c´elulas que perten¸cam a uma linha que j´a

[tenha o n´umero candidato como indispon´ıveis

Marcar no mapa as c´elulas que perten¸cam a uma coluna que j´a [tenha o n´umero candidato como indispon´ıveis

Para cada linha que tenha somente uma c´elula dispon´ıvel, Preencher a c´elula da matriz com o n´umero candidato Marcar a c´elula preenchida como indispon´ıvel

Para cada coluna que tenha somente uma c´elula dispon´ıvel, Preencher a c´elula da matriz com o n´umero candidato Marcar a c´elula preenchida como indispon´ıvel

(14)

M ´odulo

2

Pr´

atica de programa¸c˜

ao

A boa experiˆencia de in´umeros profissionais da ´area de computa¸c˜ao1que foi sendo acumulada ao longo

do tempo ´e chamada de boa pr´atica de programa¸c˜ao. Esta cole¸c˜ao de normas e princ´ıpios passou a ser tratada com o tempo como um t´opico da teoria da ciˆencia da computa¸c˜ao.

Quais s˜ao as regras ou princ´ıpios? Quais s˜ao as boas pr´aticas de programa¸c˜ao?

2.1

Regras da boa programa¸

ao

Na rotina de programa¸c˜ao, existem duas etapas que consomem tempo: o desenvolvimento dos algo-ritmos2 e a valida¸c˜ao da l´ogica de programa¸c˜ao3 dos c´odigos-fonte de um programa. Portanto, ´e sempre interessante e proveitoso dispor de uma cole¸c˜ao de algoritmos e c´odigos-fonte previamente escritos, tes-tados, analisados e validados. Isto acaba sendo um processo quase natural que ocorre em fun¸c˜ao da acumula¸c˜ao de experiˆencia e a maturidade profissional com o passar do tempo.

Uma biblioteca de algoritmos e c´odigos, ou seja, de solu¸c˜oes, ´e sempre incrementada pela adi¸c˜ao de novas solu¸c˜oes para os mesmos ou novos problemas. As novas solu¸c˜oes, na maioria das vezes, s˜ao constru´ıdas tomando como base solu¸c˜oes pr´e-existentes, pr´atica esta reconhecida como sendo valiosa. O processo consiste em reusar, aproveitando, sempre que poss´ıvel, parte do que j´a est´a escrito e, portanto, j´a validado na constru¸c˜ao de uma nova solu¸c˜ao. Por este motivo o acervo de uma biblioteca tendem a formar uma base s´olida que poder´a ser utilizada para a solu¸c˜ao de novos problemas com um grau de confian¸ca cada vez mais elevado.

Sempre que uma solu¸c˜ao ou parte de uma solu¸c˜ao ´e reconhecida como valiosa, ela tende a ser usada e reusada ou adaptada na constru¸c˜ao de uma nova solu¸c˜ao. Um evento comum neste processo de rea-proveitamento ´e a necessidade de se fazer pequenas, ou at´e mesmo grandes modifica¸c˜oes, nas solu¸c˜oes j´a existes de forma a melhor´a-las ou adequ´a-las para lidar com as novas situa¸c˜oes e que n˜ao eram previstas nas antigas.

A partir deste fato, pode-se ver que, para n˜ao se perder o controle do processo de desenvolvimento como um todo, ´e essencial que se aplique o que hoje ´e entendido e chamado de boa pr´atica de programa¸c˜ao. No fundo, isto continua sendo aplica¸c˜ao da heur´ıstica.

De forma compacta, destaca-se as principais regras:

Clareza

Toda solu¸c˜ao deve ser bastante clara quanto aos seus objetivos e sua inten¸c˜ao, caso contr´ario ser´a dif´ıcil saber se ela est´a resolvendo o problema de forma correta ou n˜ao. Clareza est´a intimamente ligada `a corre¸c˜ao.

1ao somente os cientista da computa¸ao, mas todos que utilizam a computa¸ao como meio ou fim de suas atividades.

Nisto incluem-se, principalmente, os profissionais de exatas e engenharias.

2Aplica¸ao da l´ogica na programa¸ao, isto ´e, a aplica¸ao da heur´ıstica e a elabora¸ao da l´ogica de programa¸ao. 3Corre¸ao ou depura¸ao, verifica¸ao e manuten¸ao.

(15)

Legibilidade

Todo algoritmo elaborado como solu¸c˜ao de um problema deve ser leg´ıvel. Por isso ´e fundamental utilizar uma diagrama¸c˜ao que facilite sua leitura.

Documenta¸c˜ao interna

Todo algoritmo tem que ser documentado. A documenta¸c˜ao interna ´e important´ıssima e n˜ao opcional. O uso de um cabe¸calho ´e fundamental, al´em, claro, da identifica¸c˜ao funcional dos blocos de declara¸c˜oes utilizadas na l´ogica. O cabe¸calho deve conter:

• a descri¸c˜ao geral do plano; • a finalidade da solu¸c˜ao elaborada;

• copyright e outras informa¸c˜oes relevantes;

• deve sempre fazer uso de nomes que sejam os mais autoexplicativos poss´ıveis; • usar sempre coment´arios curtos para as mais diversas finalidades.

Modularidade

Um algoritmo deve, sempre que poss´ıvel, ser escrito de forma particionada, isto ´e, em planos menores.

Reusabilidade

Reusabilidade diz respeito a dois conceitos importantes:

• Generalidade: capacidade de se construir algoritmos que possam ser usados e reutilizados para fins similares;

• Flexibilidade: capacidade de lidar com diferentes tipos de informa¸c˜ao e diferentes tipos de procedimentos.

Manutenibilidade

Os algoritmos devem ser escritos de forma a facilitar a sua adequa¸c˜ao `as necessidades futuras.

Documenta¸c˜ao em tempo de execu¸c˜ao

Todo programa tem que orientar bem o usu´ario quanto `as escolhas e a forma dos dados que devem ser fornecidos no momento da sua utiliza¸c˜ao. A documenta¸c˜ao em tempo de execu¸c˜ao ´e important´ıssima e tamb´em n˜ao ´e opcional.

Defensibilidade

Todo programa deve ter meios de lidar com entradas e sa´ıdas erradas.

2.2

Documenta¸

ao externa

A documenta¸c˜ao de um programa ´e parte integrante e essencial dele, exercendo fun¸c˜ao primordial no processo de desenvolvimento e manuten¸c˜ao do programa.

A documenta¸c˜ao de cada unidade de programa deve ser cuidadosamente elaborada e realizada dentro de padr˜ao pr´e-estabelecido. A padroniza¸c˜ao ´e importante porque facilita o entendimento e o intercˆambio de informa¸c˜ao entre os diversos membros de uma equipe (quando se est´a trabalhando em equipe) que est´a desenvolvendo um sistema complexo, al´em de favorecer a compreens˜ao e o uso do programa por terceiros. Aqueles que n˜ao est˜ao trabalhando em equipe, isto ´e, est˜ao desenvolvendo e codificando o programa de forma independente ou isolada, tamb´em necessitam documentar os programas. Por quˆe? Porque ele mesmo, em algum momento, necessitar´a reler e/ou reutilizar os programas ou partes deles. Se n˜ao

(16)

documentou adequadamente o programa escrito, ir´a ter o dissabor de n˜ao mais compreendˆe-lo e, portanto n˜ao ter´a dom´ınio sobre o programa. Neste caso acabar´a tendo que utilizar um tempo grande e precioso para (re)entender o programa ou ent˜ao escrever um programa novo por incapacidade de reaproveitar o trabalho j´a feito. Desperd´ıcio de tempo (e dinheiro), n˜ao?

As regras e recomenda¸c˜oes que ser˜ao apresentadas sobre a documenta¸c˜ao de programas devem ser seguidas, mas n˜ao devem ser encaradas como regras absolutas. E poss´ıvel se adotar algumas regras´ diferentes, ou melhor, regras que implementem os mesmos conceitos e as mesmas boas pr´aticas de pro-grama¸c˜ao de uma forma que se ajuste melhor `as necessidades atuais do que as que est˜ao sendo indicadas aqui. Utilizar estas ou outras regras ´e quest˜ao de bom senso. Entretanto, uma vez adotado um conjunto de regras, estas dever˜ao ser seguidas at´e o fim.

A documenta¸c˜ao de um programa pode ser dividida em trˆes partes ou tipos: documenta¸c˜ao interna, documenta¸c˜ao em tempo de execu¸c˜ao e documenta¸c˜ao externa.

A documenta¸c˜ao externa diz respeito `a toda informa¸c˜ao complementar `a l´ogica desenvolvida como solu¸c˜ao de um problema analisado. Resgatando a proposta da heur´ıstica, de an´alise e s´ıntese, a do-cumenta¸c˜ao externa deve conter o plano elaborado em forma narrativa, produto da compreens˜ao do problema e da estrat´egia de solu¸c˜ao revisados. O plano estruturado em itens dar´a espa¸co ao algoritmo, escrito na forma de pseudoc´odigo, seguindo um gloss´ario e regras de sintaxe e semˆantica pr´oprios.

Vale destacar que as informa¸c˜oes complementares se referem `a autoria da solu¸c˜ao, datas, vers˜oes, prop´ositos, restri¸c˜oes, observa¸c˜oes e m´etodos. O item principal ´e o algoritmo. Outros itens podem ser inseridos.

Em linhas gerais, a documenta¸c˜ao externa possui os seguintes itens:

Modelo de documenta¸c˜ao externa

T´ıtulo: Data: Autor: Prop´osito:

Entradas e Sa´ıdas: Entradas: Sa´ıdas: M´etodo:

Observa¸c˜oes, Requisitos e Restri¸c˜oes: Algoritmo/Fim algoritmo

Exemplo Suponhamos que se deseje desenvolver um algoritmo que calcule as ra´ızes de uma equa¸c˜ao do segundo grau. A documenta¸c˜ao externa desse algoritmo seria (a menos da apresenta¸c˜ao do algoritmo propriamente dito):

Documenta¸c˜ao externa

T´ıtulo: Ra´ızes Reais de Polinˆomio de Segundo Grau

Data: 09/04/2013

(17)

Prop´osito: Calcular as ra´ızes reais de um polinˆomio de segundo grau caso elas existam.

Entradas e Sa´ıdas:

Entradas: Coeficientes a, b e c do polinˆomio Sa´ıdas: Ra´ızes reais x1 e x2

M´etodo: Aplicar o m´etodo de B´ascara para determina¸c˜ao das ra´ızes reais. Primeiro se calcula o valor do parˆametro ∆ (∆ = b2−4ac) e depois

se avalia o resultado. Se ∆ for maior que zero, ent˜ao o polinˆomio tem duas ra´ızes. Se ∆ for igual a zero, o polinˆomio tem raiz dupla. Se ∆ for negativo, o polinˆomio n˜ao tem raiz real. As ra´ızes reais s˜ao calculadas usando a express˜ao x = (−b ±√∆)/(2a).

Observa¸c˜oes, Requisitos e Restri¸c˜oes:

O m´etodo s´o funciona para polinˆomios com ra´ızes reais. No caso de polinˆomios com ra´ızes complexas, o m´etodo pode prever uma sa´ıda informando ao usu´ario que o polinˆomio n˜ao tem ra´ızes reais. Algoritmo

. . .

(18)

M ´odulo

3

Pseudoc´

odigo

3.1

Sudoku

Na primeira abordagem (se¸c˜ao 1.2), a an´alise do problema do jogo conduziu para uma estrat´egia (plano) que seguia a seguinte metodologia na essˆencia:

1. para cada n´umero candidato, um mapa de disponibilidade seria criado;

2. no mapa espec´ıfico para um determinado candidato, seriam marcadas as c´elulas correspondentes `as previamente preenchidas da matriz de valores;

3. as regras seriam aplicadas para as submatrizes, linhas e colunas, marcando c´elulas como indis-pon´ıveis;

4. as linhas e colunas seriam avaliadas na busca por c´elulas dispon´ıveis “solit´arias”; 5. para cada c´elula identificada nesta condi¸c˜ao, o valor candidato seria inserido no lugar.

O plano

Repetir

Para cada n´umero no intervalo de 1 a 9, Iniciar mapa com c´elulas dispon´ıveis

Marcar no mapa as c´elulas j´a ocupadas como indispon´ıveis Se n˜ao houver mais c´elulas dispon´ıveis,

Encerrar processo Sen˜ao

Repetir at´e que n˜ao haja c´elulas dispon´ıveis isoladas,

Marcar no mapa as c´elulas que perten¸cam a submatrizes que [j´a tenham o n´umero candidato como indispon´ıveis Marcar no mapa as c´elulas que perten¸cam a uma linha que j´a

[tenha o n´umero candidato como indispon´ıveis

Marcar no mapa as c´elulas que perten¸cam a uma coluna que j´a [tenha o n´umero candidato como indispon´ıveis

Para cada linha que tenha somente uma c´elula dispon´ıvel, Preencher a c´elula da matriz com o n´umero candidato Marcar a c´elula preenchida como indispon´ıvel

Para cada coluna que tenha somente uma c´elula dispon´ıvel, Preencher a c´elula da matriz com o n´umero candidato Marcar a c´elula preenchida como indispon´ıvel

O plano se insere muito bem na proposta da heur´ıstica, pois organiza a l´ogica a ser utilizada na solu¸c˜ao do problema. Entretanto, algumas a¸c˜oes compreendidas no plano podem revelar a necessidade de se expandir em outras a¸c˜oes. Por exemplo, para saber se ainda h´a c´elulas dispon´ıveis, faz-se necess´ario identific´a-las e cont´a-las. Outro exemplo, marcar no mapa as c´elulas que perten¸cam a submatrizes que contenham o valor candidato corresponde a v´arias a¸c˜oes, como compara¸c˜oes e atribui¸c˜oes. Logo, ´e

(19)

importante olhar o plano, separar as atividades e desdobr´a-las nas a¸c˜oes prim´arias necess´arias para que a atividade seja realizada.

Assim, ser˜ao apresentadas as atividades e os correspondentes comandos j´a na forma de pseudoc´odigo. Isso facilitar´a o processo de escrita do algoritmo.

3.1.1

Contar c´

elulas dispon´ıveis

A matriz do jogo ´e uma matriz num´erica 9 × 9 chamada mat. O total de c´elulas dispon´ıveis ser´a armazenado em uma vari´avel num´erica chamada disponiveis. O processo, em si, ´e idˆentico ao processo de somat´orio. A vari´avel disponiveis ser´a inicializada com 0 e os 81 elementos da matriz ser˜ao avaliados. Toda vez que o elemento avaliado corresponder a 0, a vari´avel disponiveis ser´a incrementada. Ao final do processo, a vari´avel disponiveis conter´a o total de c´elulas dispon´ıveis.

Para indexar os elementos da matriz, ser˜ao usadas duas vari´aveis contadoras, i, j. Pseudoc´odigo

1. disponiveis ← 0

2. para i de 1 at´e 9, fazer

3. | para j de 1 at´e 9, fazer

4. | | se (mat[i, j] = 0), ent˜ao

5. | | | disponiveis ← disponiveis + 1

6. | | fim se

7. | fim para

8. fim para Fim pseudoc´odigo

3.1.2

Processar submatrizes

Pela regra 2 do Sudoku, uma submatriz (3 × 3 elementos) que contenha o valor candidato deve ter suas c´elulas dispon´ıveis marcadas como indispon´ıveis. Novamente, a matriz do jogo deve ser analisada, s´o que desta vez a varredura deve seguir os elementos dentro de cada submatriz. O primeiro elemento (elemento superior esquerdo) de cada submatriz ´e identificado pelos seguintes ´ındices: (k − 1) ∗ 3 + i com k e i variando de 1 a 3 e (l − 1) ∗ 3 + j com l e j variando de 1 a 3. Os valores de k e l indexam as submatrizes e os valores de i e j servem para percorrer a submatriz. Ent˜ao s˜ao necess´arias mais duas vari´aveis: k e l.

O m´etodo ´e simples: varre-se a submatriz a procura do valor candidato; encontrando-o, percorre-se novamente a submatriz, buscando as c´elulas dispon´ıveis e marcando-as como indispon´ıveis. A marca¸c˜ao pode ser um valor fora da faixa utilizada at´e agora, isto ´e, um valor negativo ou maior que 9. Neste momento, a escolha ser´a pelo valor −1.

Durante a primeira varredura, usar-se-´a uma vari´avel l´ogica chamada marcar cujo valor inicial ser´a FALSO. Se o valor candidato estiver presente na submatriz, esta vari´avel receber´a o valor constante l´ogico VERDADEIRO e indicar´a que as c´elulas dispon´ıveis na submatriz dever˜ao ser marcadas.

Pseudoc´odigo

1. para k de 0 at´e 2, fazer

2. | para l de 0 at´e 2, fazer

3. | | marcar ←FALSO

4. | | para i de 1 at´e 3, fazer

5. | | | para j de 1 at´e 3, fazer

6. | | | | se (mat[k ∗ 3 + i, l ∗ 3 + j] = n), ent˜ao

7. | | | | | marcar ←VERDADEIRO

8. | | | | fim se

9. | | | fim para

10. | | fim para

11. | | se (marcar =VERDADEIRO), ent˜ao

12. | | | para i de 1 at´e 3, fazer

13. | | | | para j de 1 at´e 3, fazer

14. | | | | | se (mat[k ∗ 3 + i, l ∗ 3 + j] = 0), ent˜ao

(20)

16. | | | | | fim se 17. | | | | fim para 18. | | | fim para 19. | | fim se 20. | fim para 21. fim para Fim pseudoc´odigo

3.1.3

Processar linhas e colunas

Pseudoc´odigo

1. para i de 1 at´e 9, fazer

2. | marcar ←FALSO

3. | para j de 1 at´e 9, fazer

4. | | se (mat[i, j] = n), ent˜ao

5. | | | marcar ←VERDADEIRO

6. | | fim se

7. | fim para

8. | se (marcar =VERDADEIRO), ent˜ao

9. | | para j de 1 at´e 9, fazer

10. | | | se (mat[i, j] = 0), ent˜ao 11. | | | | mat[i, j] ← −1 12. | | | fim se 13. | | fim para 14. | fim se 15. fim para

16. para j de 1 at´e 9, fazer

17. | marcar ←FALSO

18. | para i de 1 at´e 9, fazer

19. | | se (mat[i, j] = n), ent˜ao

20. | | | marcar ←VERDADEIRO

21. | | fim se

22. | fim para

23. | se (marcar =VERDADEIRO), ent˜ao

24. | | para i de 1 at´e 9, fazer

25. | | | se (mat[i, j] = 0), ent˜ao 26. | | | | mat[i, j] ← −1 27. | | | fim se 28. | | fim para 29. | fim se 30. fim para Fim pseudoc´odigo

3.1.4

Contar c´

elulas dispon´ıveis nas linhas e colunas

Pseudoc´odigo

1. para i de 1 at´e 9, fazer

2. | linha[i, 1] ← 0

3. | coluna[i, 1] ← 0

4. | para j de 1 at´e 9, fazer

5. | | se (mat[i, j] = 0), ent˜ao 6. | | | linha[i, 1] ← linha[i, 1] + 1 7. | | | linha[i, 2] ← j 8. | | fim se 9. | | se (mat[j, i] = 0), ent˜ao 10. | | | coluna[i, 1] ← coluna[i, 1] + 1

(21)

11. | | | coluna[i, 2] ← j

12. | | fim se

13. | fim para

14. fim para Fim pseudoc´odigo

3.1.5

Inserir valor candidato na matriz do jogo

Pseudoc´odigo

1. ref azer ←FALSO

2. para i de 1 at´e 9, fazer

3. | se (linha[i, 1] = 1), ent˜ao

4. | | mat(i, linha[i, 2]) ← n

5. | | ref azer ←VERDADEIRO

6. | fim se

7. | se (coluna[i, 1] = 1), ent˜ao

8. | | mat(coluna[i, 2], i) ← n

9. | | ref azer ←VERDADEIRO

10. | fim se

11. fim para Fim pseudoc´odigo

3.1.6

Desmarcar c´

elulas

Pseudoc´odigo

1. para i de 1 at´e 9, fazer

2. | para j de 1 at´e 9, fazer

3. | | se (mat[i, j] = −1), ent˜ao

4. | | | mat[i, j] ← 0

5. | | fim se

6. | fim para

7. fim para Fim pseudoc´odigo

3.1.7

Documenta¸

ao externa

Documentac¸˜ao T´ıtulo

Solu¸c˜ao para o problema de l´ogica sudoku. Prop´osito

Resolver o problema de l´ogica sudoku atrav´es de mapas auxiliares. M´etodo ... Entradas ... Sa´ıdas ...

Observac¸ ˜oes, Restric¸ ˜oes, Requisitos ...

(22)

Algoritmo Soluc¸˜ao Sudoku declarar mat(9, 9) num´erico

declarar linha(9, 2), coluna(9, 2) num´ericos declarar i, j, k, l num´ericos

declarar n num´erico

declarar disponiveis num´erico declarar marcar, ref azer l´ogicos

{=== inicializar a matriz ===}

1. para i de 1 at´e 9, fazer

2. | para j de 1 at´e 9, fazer

3. | | mat[i, j] ← 0

4. | fim para

5. fim para

{=== atribuir valores `as c´elulas ===}

6. mat(1, 1) ← 1

{=== repetir processo at´e n˜ao ter mais c´elulas dispon´ıveis ===}

7. fazer

{=== para cada candidato n ===}

8. | para n de 1 at´e 9, fazer

{=== contar c´elulas dispon´ıveis ===}

9. | | disponiveis ← 0

10. | | para i de 1 at´e 9, fazer

11. | | | para j de 1 at´e 9, fazer

12. | | | | se (mat[i, j] = 0), ent˜ao 13. | | | | | disponiveis ← disponiveis + 1 14. | | | | fim se 15. | | | fim para 16. | | fim para {=== se h´a c´elulas dispon´ıveis ===} 17. | | se (disponiveis 6= 0), ent˜ao 18. | | | fazer

{=== processar cada submatriz ===}

19. | | | | para k de 0 at´e 2, fazer

20. | | | | | para l de 0 at´e 2, fazer

21. | | | | | | marcar ←FALSO

22. | | | | | | para i de 1 at´e 3, fazer

23. | | | | | | | para j de 1 at´e 3, fazer

24. | | | | | | | | se (mat[k ∗ 3 + i, l ∗ 3 + j] = n), ent˜ao

25. | | | | | | | | | marcar ←VERDADEIRO

26. | | | | | | | | fim se

27. | | | | | | | fim para

28. | | | | | | fim para

29. | | | | | | se (marcar =VERDADEIRO), ent˜ao

30. | | | | | | | para i de 1 at´e 3, fazer

31. | | | | | | | | para j de 1 at´e 3, fazer

32. | | | | | | | | | se (mat[k ∗ 3 + i, l ∗ 3 + j] = 0), ent˜ao

33. | | | | | | | | | | mat[k ∗ 3 + i, l ∗ 3 + j] ← −1

34. | | | | | | | | | fim se

(23)

36. | | | | | | | fim para

37. | | | | | | fim se

38. | | | | | fim para

39. | | | | fim para

{=== processar cada linha ===}

40. | | | | para i de 1 at´e 9, fazer

41. | | | | | marcar ←FALSO

42. | | | | | para j de 1 at´e 9, fazer

43. | | | | | | se (mat[i, j] = n), ent˜ao

44. | | | | | | | marcar ←VERDADEIRO

45. | | | | | | fim se

46. | | | | | fim para

47. | | | | | se (marcar =VERDADEIRO), ent˜ao

48. | | | | | | para j de 1 at´e 9, fazer

49. | | | | | | | se (mat[i, j] = 0), ent˜ao 50. | | | | | | | | mat[i, j] ← −1 51. | | | | | | | fim se 52. | | | | | | fim para 53. | | | | | fim se 54. | | | | fim para

{=== processar cada coluna ===}

55. | | | | para j de 1 at´e 9, fazer

56. | | | | | marcar ←FALSO

57. | | | | | para i de 1 at´e 9, fazer

58. | | | | | | se (mat[i, j] = n), ent˜ao

59. | | | | | | | marcar ←VERDADEIRO

60. | | | | | | fim se

61. | | | | | fim para

62. | | | | | se (marcar =VERDADEIRO), ent˜ao

63. | | | | | | para i de 1 at´e 9, fazer

64. | | | | | | | se (mat[i, j] = 0), ent˜ao 65. | | | | | | | | mat[i, j] ← −1 66. | | | | | | | fim se 67. | | | | | | fim para 68. | | | | | fim se 69. | | | | fim para

{=== identificar linhas e colunas com somente uma c´elula dispon´ıvel ===}

70. | | | | para i de 1 at´e 9, fazer

71. | | | | | linha[i, 1] ← 0

72. | | | | | coluna[i, 1] ← 0

73. | | | | | para j de 1 at´e 9, fazer

74. | | | | | | se (mat[i, j] = 0), ent˜ao 75. | | | | | | | linha[i, 1] ← linha[i, 1] + 1 76. | | | | | | | linha[i, 2] ← j 77. | | | | | | fim se 78. | | | | | | se (mat[j, i] = 0), ent˜ao 79. | | | | | | | coluna[i, 1] ← coluna[i, 1] + 1 80. | | | | | | | coluna[i, 2] ← j 81. | | | | | | fim se 82. | | | | | fim para 83. | | | | fim para {=== inserir candidato ===}

84. | | | | ref azer ←FALSO

85. | | | | para i de 1 at´e 9, fazer

86. | | | | | se (linha[i, 1] = 1), ent˜ao

87. | | | | | | mat(i, linha[i, 2]) ← n

88. | | | | | | ref azer ←VERDADEIRO

(24)

90. | | | | | se (coluna[i, 1] = 1), ent˜ao

91. | | | | | | mat(coluna[i, 2], i) ← n

92. | | | | | | ref azer ←VERDADEIRO

93. | | | | | fim se

94. | | | | fim para

95. | | | enquanto (ref azer =VERDADEIRO) {=== desmarcar c´elulas indispon´ıveis ===}

96. | | | para i de 1 at´e 9, fazer

97. | | | | para j de 1 at´e 9, fazer

98. | | | | | se (mat[i, j] = −1), ent˜ao 99. | | | | | | mat[i, j] ← 0 100. | | | | | fim se 101. | | | | fim para 102. | | | fim para 103. | | sen˜ao {=== se n˜ao h´a c´elulas dispon´ıveis ===} 104. | | | parar 105. | | fim se 106. | fim para 107. enquanto (disponiveis 6= 0) Fim algoritmo

Referências

Documentos relacionados

Verificou-se que as atividades exercidas pelas acadêmicas de enfermagem, através do projeto de extensão, na referida instituição de longa permanência,

Este arranjo permitiu investigar o efeito de diversos parâmetros, tais como: pressão de evaporação, rotação do ventilador, título do refrigerante na entrada do evaporador, fluxo

Deus está sinalizando para você a recompensa que Ele planejou para os Seus (2 Timóteo 2:12).. A aflição momentânea está nos preparando para o eterno peso da glória, além de

(2009), o IOH propõe um modelo de mensuração de desigualdade de oportunidade, em vista do avanço de bem-estar econômico, sendo este constituído de um conjunto de oportunidades

Enquanto o SMIT, na ocorrência de falhas, as réplicas comprometidas continuam na execução do protocolo, influenciando no desempenho do mesmo, em nosso modelo as réplicas

Os corrimãos de aço inox da Schindler são concebidos para combinar com o interior, as formas e as texturas da cabina e podem ser montados nos painéis laterais e no painel de

Como contribuições do trabalho, é analisada a influência dos parâmetros de geração do espectrograma e são introduzidas as inovações de filtro de frequências e de gradiente com