O documento discute a técnica de desenvolvimento de algoritmos conhecida como tentativa e erro (backtracking). A técnica é usada quando se quer encontrar soluções para problemas nos quais não se conhece uma regra fixa de computação, tentando todas as alternativas possíveis de forma metódica até encontrar uma sequência de decisões que funcione. Exemplos como encontrar um caminho em um labirinto e colorir um mapa geográfico são apresentados para ilustrar como a técnica pode ser aplicada.
(ACH2002) Introdução à Análise de Algoritmos - Aula 04
1. Aula 04 – T´ecnicas de
Desenvolvimento de Algoritmos:
Tentativa e Erro (Backtracking)
Norton Trevisan Roman
norton@usp.br
23 de agosto de 2018
Norton Trevisan Romannorton@usp.br Aula 04 – T´ecnicas de Desenvolvimento de Algoritmos: Tentativa e Erro (Backtracking)23 de agosto de 2018 1 / 29
2. Tentativa e Erro
Suponha que vocˆe tem que tomar uma s´erie de
decis˜oes dentre v´arias possibilidades, onde
Norton Trevisan Romannorton@usp.br Aula 04 – T´ecnicas de Desenvolvimento de Algoritmos: Tentativa e Erro (Backtracking)23 de agosto de 2018 2 / 29
3. Tentativa e Erro
Suponha que vocˆe tem que tomar uma s´erie de
decis˜oes dentre v´arias possibilidades, onde
Vocˆe n˜ao tem informa¸c˜ao suficiente para saber o que
escolher
Norton Trevisan Romannorton@usp.br Aula 04 – T´ecnicas de Desenvolvimento de Algoritmos: Tentativa e Erro (Backtracking)23 de agosto de 2018 2 / 29
4. Tentativa e Erro
Suponha que vocˆe tem que tomar uma s´erie de
decis˜oes dentre v´arias possibilidades, onde
Vocˆe n˜ao tem informa¸c˜ao suficiente para saber o que
escolher
Cada decis˜ao leva a um novo conjunto de escolhas
Norton Trevisan Romannorton@usp.br Aula 04 – T´ecnicas de Desenvolvimento de Algoritmos: Tentativa e Erro (Backtracking)23 de agosto de 2018 2 / 29
5. Tentativa e Erro
Suponha que vocˆe tem que tomar uma s´erie de
decis˜oes dentre v´arias possibilidades, onde
Vocˆe n˜ao tem informa¸c˜ao suficiente para saber o que
escolher
Cada decis˜ao leva a um novo conjunto de escolhas
Alguma sequˆencia de escolhas (possivelmente mais que uma)
pode ser a solu¸c˜ao para o problema
Norton Trevisan Romannorton@usp.br Aula 04 – T´ecnicas de Desenvolvimento de Algoritmos: Tentativa e Erro (Backtracking)23 de agosto de 2018 2 / 29
6. Tentativa e Erro
Suponha que vocˆe tem que tomar uma s´erie de
decis˜oes dentre v´arias possibilidades, onde
Vocˆe n˜ao tem informa¸c˜ao suficiente para saber o que
escolher
Cada decis˜ao leva a um novo conjunto de escolhas
Alguma sequˆencia de escolhas (possivelmente mais que uma)
pode ser a solu¸c˜ao para o problema
Tentativa e erro ´e um modo met´odico de tentar
v´arias sequˆencias de decis˜oes, at´e encontrar uma
que funcione
Norton Trevisan Romannorton@usp.br Aula 04 – T´ecnicas de Desenvolvimento de Algoritmos: Tentativa e Erro (Backtracking)23 de agosto de 2018 2 / 29
7. Tentativa e Erro
T´ecnica de solu¸c˜ao de problemas
Usada quando se quer achar solu¸c˜oes para problemas para os
quais n˜ao se conhece uma regra fixa de computa¸c˜ao
Basicamente, tentamos todas as alternativas poss´ıveis
Norton Trevisan Romannorton@usp.br Aula 04 – T´ecnicas de Desenvolvimento de Algoritmos: Tentativa e Erro (Backtracking)23 de agosto de 2018 3 / 29
8. Tentativa e Erro
T´ecnica de solu¸c˜ao de problemas
Usada quando se quer achar solu¸c˜oes para problemas para os
quais n˜ao se conhece uma regra fixa de computa¸c˜ao
Basicamente, tentamos todas as alternativas poss´ıveis
Passos
Escolher uma opera¸c˜ao plaus´ıvel;
Executar a opera¸c˜ao com os dados;
Se a meta n˜ao foi alcan¸cada, repita o processo at´e que se
atinja a meta ou se evidencie a insolubilidade do problema.
Norton Trevisan Romannorton@usp.br Aula 04 – T´ecnicas de Desenvolvimento de Algoritmos: Tentativa e Erro (Backtracking)23 de agosto de 2018 3 / 29
9. Tentativa e Erro
Tentativa e erro ´e uma t´ecnica que aproveita bem a
recursividade
A recursividade pode ser usada para resolver problemas cuja
solu¸c˜ao ´e do tipo tentar todas as alternativas poss´ıveis
Norton Trevisan Romannorton@usp.br Aula 04 – T´ecnicas de Desenvolvimento de Algoritmos: Tentativa e Erro (Backtracking)23 de agosto de 2018 4 / 29
10. Tentativa e Erro
Tentativa e erro ´e uma t´ecnica que aproveita bem a
recursividade
A recursividade pode ser usada para resolver problemas cuja
solu¸c˜ao ´e do tipo tentar todas as alternativas poss´ıveis
A ideia para algoritmos tentativa e erro ´e decompor
o processo em um n´umero finito de sub-tarefas
parciais (expressas de forma recursiva)
E ent˜ao explor´a-las exaustivamente
Norton Trevisan Romannorton@usp.br Aula 04 – T´ecnicas de Desenvolvimento de Algoritmos: Tentativa e Erro (Backtracking)23 de agosto de 2018 4 / 29
11. Tentativa e Erro
A constru¸c˜ao de uma solu¸c˜ao ´e obtida atrav´es de
tentativas (ou pesquisas) que gradualmente
constroem e percorrem uma ´arvore de sub-tarefas.
Norton Trevisan Romannorton@usp.br Aula 04 – T´ecnicas de Desenvolvimento de Algoritmos: Tentativa e Erro (Backtracking)23 de agosto de 2018 5 / 29
12. Tentativa e Erro
Funcionamento:
Passos em dire¸c˜ao `a solu¸c˜ao final s˜ao tentados e
registrados (em uma estrutura de dados)
Caso esses passos tomados n˜ao levem `a solu¸c˜ao
final, eles podem ser retirados e apagados do
registro.
A busca na ´arvore de solu¸c˜oes pode crescer
rapidamente (at´e mesmo exponencialmente)
Pode ser necess´ario usar algoritmos aproximados ou
heur´ısticas, que n˜ao garantem a solu¸c˜ao ´otima, mas s˜ao
r´apidas
Norton Trevisan Romannorton@usp.br Aula 04 – T´ecnicas de Desenvolvimento de Algoritmos: Tentativa e Erro (Backtracking)23 de agosto de 2018 6 / 29
13. Tentativa e Erro
Exploramos cada possibilidade como segue:
Se a possibilidade ´e a resposta, retorne “sucesso”
Se a possibilidade n˜ao for a resposta, e n˜ao houver
outra a ser testada a partir dela, retorne “falha”
Para cada possibilidade, a partir da atual:
Explore a nova possibilidade (recursivo)
Se encontrou a resposta, retorne “sucesso”
Esgotadas as possibilidades, retorne “falha”
Norton Trevisan Romannorton@usp.br Aula 04 – T´ecnicas de Desenvolvimento de Algoritmos: Tentativa e Erro (Backtracking)23 de agosto de 2018 7 / 29
14. Tentativa e Erro
Exemplo: Caminho em Labirinto
Dado um labirinto,
encontre um caminho
da entrada `a sa´ıda
Norton Trevisan Romannorton@usp.br Aula 04 – T´ecnicas de Desenvolvimento de Algoritmos: Tentativa e Erro (Backtracking)23 de agosto de 2018 8 / 29
15. Tentativa e Erro
Exemplo: Caminho em Labirinto
Dado um labirinto,
encontre um caminho
da entrada `a sa´ıda
Em cada interse¸c˜ao,
vocˆe tem que decidir
se:
Segue direto
Vai `a esquerda
Vai `a direita
Norton Trevisan Romannorton@usp.br Aula 04 – T´ecnicas de Desenvolvimento de Algoritmos: Tentativa e Erro (Backtracking)23 de agosto de 2018 8 / 29
16. Tentativa e Erro
Exemplo: Caminho em Labirinto
S´o que... vocˆe n˜ao tem
informa¸c˜ao suficiente
para escolher
corretamente
Norton Trevisan Romannorton@usp.br Aula 04 – T´ecnicas de Desenvolvimento de Algoritmos: Tentativa e Erro (Backtracking)23 de agosto de 2018 9 / 29
17. Tentativa e Erro
Exemplo: Caminho em Labirinto
S´o que... vocˆe n˜ao tem
informa¸c˜ao suficiente
para escolher
corretamente
Cada escolha leva a
outro conjunto de
escolhas
Norton Trevisan Romannorton@usp.br Aula 04 – T´ecnicas de Desenvolvimento de Algoritmos: Tentativa e Erro (Backtracking)23 de agosto de 2018 9 / 29
18. Tentativa e Erro
Exemplo: Caminho em Labirinto
S´o que... vocˆe n˜ao tem
informa¸c˜ao suficiente
para escolher
corretamente
Cada escolha leva a
outro conjunto de
escolhas
Uma ou mais sequˆencia de escolhas pode ser a
solu¸c˜ao...
Norton Trevisan Romannorton@usp.br Aula 04 – T´ecnicas de Desenvolvimento de Algoritmos: Tentativa e Erro (Backtracking)23 de agosto de 2018 9 / 29
19. Tentativa e Erro
Exemplo: Caminho em Labirinto
S´o que... vocˆe n˜ao tem
informa¸c˜ao suficiente
para escolher
corretamente
Cada escolha leva a
outro conjunto de
escolhas
Uma ou mais sequˆencia de escolhas pode ser a
solu¸c˜ao... Ou n˜ao!
Norton Trevisan Romannorton@usp.br Aula 04 – T´ecnicas de Desenvolvimento de Algoritmos: Tentativa e Erro (Backtracking)23 de agosto de 2018 9 / 29
20. Tentativa e Erro
Exemplo: Caminho em Labirinto
E a solu¸c˜ao?
Norton Trevisan Romannorton@usp.br Aula 04 – T´ecnicas de Desenvolvimento de Algoritmos: Tentativa e Erro (Backtracking)23 de agosto de 2018 10 / 29
21. Tentativa e Erro
Exemplo: Caminho em Labirinto
E a solu¸c˜ao?
Escolha uma metodologia
para fazer tentativas
Norton Trevisan Romannorton@usp.br Aula 04 – T´ecnicas de Desenvolvimento de Algoritmos: Tentativa e Erro (Backtracking)23 de agosto de 2018 10 / 29
22. Tentativa e Erro
Exemplo: Caminho em Labirinto
E a solu¸c˜ao?
Escolha uma metodologia
para fazer tentativas
Ex: primeiro tentar `a
direita, depois `a frente, e
ent˜ao `a esquerda
Norton Trevisan Romannorton@usp.br Aula 04 – T´ecnicas de Desenvolvimento de Algoritmos: Tentativa e Erro (Backtracking)23 de agosto de 2018 10 / 29
23. Tentativa e Erro
Exemplo: Caminho em Labirinto
E a solu¸c˜ao?
Escolha uma metodologia
para fazer tentativas
Ex: primeiro tentar `a
direita, depois `a frente, e
ent˜ao `a esquerda
Ent˜ao, a cada decis˜ao, siga essa ordem de escolhas
Norton Trevisan Romannorton@usp.br Aula 04 – T´ecnicas de Desenvolvimento de Algoritmos: Tentativa e Erro (Backtracking)23 de agosto de 2018 10 / 29
24. Tentativa e Erro
Exemplo: Caminho em Labirinto
E a solu¸c˜ao?
Escolha uma metodologia
para fazer tentativas
Ex: primeiro tentar `a
direita, depois `a frente, e
ent˜ao `a esquerda
Ent˜ao, a cada decis˜ao, siga essa ordem de escolhas
Se todas as escolhas em um ponto se esgotaram, volte ao
anterior, e escolha uma alternativa ainda n˜ao explorada
(seguindo a metodologia de escolha) a partir desse ponto
Norton Trevisan Romannorton@usp.br Aula 04 – T´ecnicas de Desenvolvimento de Algoritmos: Tentativa e Erro (Backtracking)23 de agosto de 2018 10 / 29
25. Tentativa e Erro
Exemplo: Colora¸c˜ao de Mapas
Vocˆe deseja colorir um
mapa com no m´aximo
4 cores: Vermelho,
amarelo, verde e azul
Norton Trevisan Romannorton@usp.br Aula 04 – T´ecnicas de Desenvolvimento de Algoritmos: Tentativa e Erro (Backtracking)23 de agosto de 2018 11 / 29
26. Tentativa e Erro
Exemplo: Colora¸c˜ao de Mapas
Vocˆe deseja colorir um
mapa com no m´aximo
4 cores: Vermelho,
amarelo, verde e azul
Pa´ıses adjacentes
devem ter cores
diferentes
Norton Trevisan Romannorton@usp.br Aula 04 – T´ecnicas de Desenvolvimento de Algoritmos: Tentativa e Erro (Backtracking)23 de agosto de 2018 11 / 29
27. Tentativa e Erro
Exemplo: Colora¸c˜ao de Mapas
Vocˆe deseja colorir um
mapa com no m´aximo
4 cores: Vermelho,
amarelo, verde e azul
Pa´ıses adjacentes
devem ter cores
diferentes
Norton Trevisan Romannorton@usp.br Aula 04 – T´ecnicas de Desenvolvimento de Algoritmos: Tentativa e Erro (Backtracking)23 de agosto de 2018 11 / 29
28. Tentativa e Erro
Exemplo: Colora¸c˜ao de Mapas
Em cada itera¸c˜ao, vocˆe
deve decidir de que cor
pintar um pa´ıs, dadas
as cores j´a atribu´ıdas
aos vizinhos imediatos
Norton Trevisan Romannorton@usp.br Aula 04 – T´ecnicas de Desenvolvimento de Algoritmos: Tentativa e Erro (Backtracking)23 de agosto de 2018 12 / 29
29. Tentativa e Erro
Exemplo: Colora¸c˜ao de Mapas
Em cada itera¸c˜ao, vocˆe
deve decidir de que cor
pintar um pa´ıs, dadas
as cores j´a atribu´ıdas
aos vizinhos imediatos
Vocˆe n˜ao tem informa¸c˜ao
suficiente para escolher as
cores (s´o conhece os
vizinhos imediatos)
Norton Trevisan Romannorton@usp.br Aula 04 – T´ecnicas de Desenvolvimento de Algoritmos: Tentativa e Erro (Backtracking)23 de agosto de 2018 12 / 29
30. Tentativa e Erro
Exemplo: Colora¸c˜ao de Mapas
Cada escolha leva a
outro conjunto de
escolhas
Norton Trevisan Romannorton@usp.br Aula 04 – T´ecnicas de Desenvolvimento de Algoritmos: Tentativa e Erro (Backtracking)23 de agosto de 2018 13 / 29
31. Tentativa e Erro
Exemplo: Colora¸c˜ao de Mapas
Cada escolha leva a
outro conjunto de
escolhas
Uma ou mais sequˆencia
de passos pode ser a
solu¸c˜ao
Norton Trevisan Romannorton@usp.br Aula 04 – T´ecnicas de Desenvolvimento de Algoritmos: Tentativa e Erro (Backtracking)23 de agosto de 2018 13 / 29
32. Tentativa e Erro
Exemplo: Colora¸c˜ao de Mapas
E a solu¸c˜ao?
Norton Trevisan Romannorton@usp.br Aula 04 – T´ecnicas de Desenvolvimento de Algoritmos: Tentativa e Erro (Backtracking)23 de agosto de 2018 14 / 29
33. Tentativa e Erro
Exemplo: Colora¸c˜ao de Mapas
E a solu¸c˜ao?
1. Pinte um pa´ıs inicial
Norton Trevisan Romannorton@usp.br Aula 04 – T´ecnicas de Desenvolvimento de Algoritmos: Tentativa e Erro (Backtracking)23 de agosto de 2018 14 / 29
34. Tentativa e Erro
Exemplo: Colora¸c˜ao de Mapas
E a solu¸c˜ao?
1. Pinte um pa´ıs inicial
2. Escolha cores para seus
vizinhos, obedecendo `a
regra
Norton Trevisan Romannorton@usp.br Aula 04 – T´ecnicas de Desenvolvimento de Algoritmos: Tentativa e Erro (Backtracking)23 de agosto de 2018 14 / 29
35. Tentativa e Erro
Exemplo: Colora¸c˜ao de Mapas
E a solu¸c˜ao?
1. Pinte um pa´ıs inicial
2. Escolha cores para seus
vizinhos, obedecendo `a
regra
3. Escolha um vizinho
(seguindo uma ordem
pr´e-definida)
Norton Trevisan Romannorton@usp.br Aula 04 – T´ecnicas de Desenvolvimento de Algoritmos: Tentativa e Erro (Backtracking)23 de agosto de 2018 14 / 29
36. Tentativa e Erro
Exemplo: Colora¸c˜ao de Mapas
E a solu¸c˜ao?
1. Pinte um pa´ıs inicial
2. Escolha cores para seus
vizinhos, obedecendo `a
regra
3. Escolha um vizinho
(seguindo uma ordem
pr´e-definida)
4. Repita o procedimento do
passo 2 a partir desse
vizinho
Norton Trevisan Romannorton@usp.br Aula 04 – T´ecnicas de Desenvolvimento de Algoritmos: Tentativa e Erro (Backtracking)23 de agosto de 2018 14 / 29
37. Tentativa e Erro
Exemplo: Colora¸c˜ao de Mapas
5. Se n˜ao for poss´ıvel colorir
algu´em, volte `a escolha
anterior, e troque a cor do
pa´ıs no centro desse passo
Norton Trevisan Romannorton@usp.br Aula 04 – T´ecnicas de Desenvolvimento de Algoritmos: Tentativa e Erro (Backtracking)23 de agosto de 2018 15 / 29
38. Tentativa e Erro
Exemplo: Colora¸c˜ao de Mapas
5. Se n˜ao for poss´ıvel colorir
algu´em, volte `a escolha
anterior, e troque a cor do
pa´ıs no centro desse passo
Note que, se n˜ao for
poss´ıvel trocar a cor
deste, voltamos ao
anterior a ele
Norton Trevisan Romannorton@usp.br Aula 04 – T´ecnicas de Desenvolvimento de Algoritmos: Tentativa e Erro (Backtracking)23 de agosto de 2018 15 / 29
39. Tentativa e Erro
Exemplo: Colora¸c˜ao de Mapas
5. Se n˜ao for poss´ıvel colorir
algu´em, volte `a escolha
anterior, e troque a cor do
pa´ıs no centro desse passo
Note que, se n˜ao for
poss´ıvel trocar a cor
deste, voltamos ao
anterior a ele
Vamos voltando e revendo
nossas escolhas at´e
acertar
Norton Trevisan Romannorton@usp.br Aula 04 – T´ecnicas de Desenvolvimento de Algoritmos: Tentativa e Erro (Backtracking)23 de agosto de 2018 15 / 29
40. Tentativa e Erro
Exemplo: Passeio do Cavalo
Dado um tabuleiro com
n × n posi¸c˜oes, o cavalo se
movimenta segundo as regras
do xadrez:
Norton Trevisan Romannorton@usp.br Aula 04 – T´ecnicas de Desenvolvimento de Algoritmos: Tentativa e Erro (Backtracking)23 de agosto de 2018 16 / 29
41. Tentativa e Erro
Exemplo: Passeio do Cavalo
Dado um tabuleiro com
n × n posi¸c˜oes, o cavalo se
movimenta segundo as regras
do xadrez:
Problema: a partir de
(x0, y0), encontrar, se existir,
um passeio do cavalo que
visite todos os pontos do
tabuleiro uma ´unica vez
Norton Trevisan Romannorton@usp.br Aula 04 – T´ecnicas de Desenvolvimento de Algoritmos: Tentativa e Erro (Backtracking)23 de agosto de 2018 16 / 29
42. Tentativa e Erro
Exemplo: Passeio do Cavalo – Representa¸c˜ao
Tabuleiro: matriz t (n × n)
de inteiros
t[x][y] = 0 → (x, y) n˜ao
visitado
t[x][y] = i → (x, y) visitado
no i-´esimo movimento
Norton Trevisan Romannorton@usp.br Aula 04 – T´ecnicas de Desenvolvimento de Algoritmos: Tentativa e Erro (Backtracking)23 de agosto de 2018 17 / 29
43. Tentativa e Erro
Exemplo: Passeio do Cavalo – Representa¸c˜ao
Tabuleiro: matriz t (n × n)
de inteiros
t[x][y] = 0 → (x, y) n˜ao
visitado
t[x][y] = i → (x, y) visitado
no i-´esimo movimento
Note que o valor das c´elulas guarda o hist´orico dos
movimentos
Norton Trevisan Romannorton@usp.br Aula 04 – T´ecnicas de Desenvolvimento de Algoritmos: Tentativa e Erro (Backtracking)23 de agosto de 2018 17 / 29
44. Tentativa e Erro
Exemplo: Passeio do Cavalo – Algoritmo
void tenta() {
inicializa sele¸c~ao de movimentos
ENQUANTO (movimento n~ao bem sucedido E existem candidatos a
movimento) {
seleciona pr´oximo candidato ao movimento
SE (aceit´avel) {
registra movimento
SE (tabuleiro n~ao est´a cheio) {
tenta novo movimento; // Chamada recursiva a tenta()
SE (n~ao sucedido) apaga registro anterior
}
}
}
}
Norton Trevisan Romannorton@usp.br Aula 04 – T´ecnicas de Desenvolvimento de Algoritmos: Tentativa e Erro (Backtracking)23 de agosto de 2018 18 / 29
45. Tentativa e Erro
Exemplo: Passeio do Cavalo – Algoritmo
abastece t[i][j]
void tenta() {
inicializa sele¸c~ao de movimentos
ENQUANTO (movimento n~ao bem sucedido E existem candidatos a
movimento) {
seleciona pr´oximo candidato ao movimento
SE (aceit´avel) {
registra movimento
SE (tabuleiro n~ao est´a cheio) {
tenta novo movimento; // Chamada recursiva a tenta()
SE (n~ao sucedido) apaga registro anterior
}
}
}
}
Norton Trevisan Romannorton@usp.br Aula 04 – T´ecnicas de Desenvolvimento de Algoritmos: Tentativa e Erro (Backtracking)23 de agosto de 2018 18 / 29
46. Tentativa e Erro
Exemplo: Passeio do Cavalo – Algoritmo
O movimento anterior
n˜ao leva `a solu¸c˜ao. Deve
voltar (backtracking)
void tenta() {
inicializa sele¸c~ao de movimentos
ENQUANTO (movimento n~ao bem sucedido E existem candidatos a
movimento) {
seleciona pr´oximo candidato ao movimento
SE (aceit´avel) {
registra movimento
SE (tabuleiro n~ao est´a cheio) {
tenta novo movimento; // Chamada recursiva a tenta()
SE (n~ao sucedido) apaga registro anterior
}
}
}
}
Norton Trevisan Romannorton@usp.br Aula 04 – T´ecnicas de Desenvolvimento de Algoritmos: Tentativa e Erro (Backtracking)23 de agosto de 2018 18 / 29
47. Tentativa e Erro
Exemplo: Passeio do Cavalo – Algoritmo
Ao final do m´etodo, o tabuleiro conter´a a resposta
void tenta() {
inicializa sele¸c~ao de movimentos
ENQUANTO (movimento n~ao bem sucedido E existem candidatos a
movimento) {
seleciona pr´oximo candidato ao movimento
SE (aceit´avel) {
registra movimento
SE (tabuleiro n~ao est´a cheio) {
tenta novo movimento; // Chamada recursiva a tenta()
SE (n~ao sucedido) apaga registro anterior
}
}
}
}
Norton Trevisan Romannorton@usp.br Aula 04 – T´ecnicas de Desenvolvimento de Algoritmos: Tentativa e Erro (Backtracking)23 de agosto de 2018 18 / 29
48. Tentativa e Erro
Exemplo: Passeio do Cavalo – C´odigo
class Cavalo {
int[] dx = { 2, 1,-1,-2,-2,-1, 1, 2};
int[] dy = { 1, 2, 2, 1,-1,-2,-2,-1};
int num, numQuad;
int[][] tab;
Cavalo(int num) {
this.num = num;
this.numQuad = num * num;
this.tab = new int[num][num];
}
boolean aceitavel(int x, int y) {
return(x >= 0 && x <= num-1 && y >= 0 && y <= num-1 &&
tab[x][y] == 0);
}
Norton Trevisan Romannorton@usp.br Aula 04 – T´ecnicas de Desenvolvimento de Algoritmos: Tentativa e Erro (Backtracking)23 de agosto de 2018 19 / 29
49. Tentativa e Erro
Exemplo: Passeio do Cavalo – C´odigo
Deslocamentos poss´ıveis a
partir da posi¸c˜ao do cavalo
class Cavalo {
int[] dx = { 2, 1,-1,-2,-2,-1, 1, 2};
int[] dy = { 1, 2, 2, 1,-1,-2,-2,-1};
int num, numQuad;
int[][] tab;
Cavalo(int num) {
this.num = num;
this.numQuad = num * num;
this.tab = new int[num][num];
}
boolean aceitavel(int x, int y) {
return(x >= 0 && x <= num-1 && y >= 0 && y <= num-1 &&
tab[x][y] == 0);
}
Norton Trevisan Romannorton@usp.br Aula 04 – T´ecnicas de Desenvolvimento de Algoritmos: Tentativa e Erro (Backtracking)23 de agosto de 2018 19 / 29
50. Tentativa e Erro
Exemplo: Passeio do Cavalo – C´odigo
N´umero de quadros em
uma linha e total de
quadros no tabuleiro
class Cavalo {
int[] dx = { 2, 1,-1,-2,-2,-1, 1, 2};
int[] dy = { 1, 2, 2, 1,-1,-2,-2,-1};
int num, numQuad;
int[][] tab;
Cavalo(int num) {
this.num = num;
this.numQuad = num * num;
this.tab = new int[num][num];
}
boolean aceitavel(int x, int y) {
return(x >= 0 && x <= num-1 && y >= 0 && y <= num-1 &&
tab[x][y] == 0);
}
Norton Trevisan Romannorton@usp.br Aula 04 – T´ecnicas de Desenvolvimento de Algoritmos: Tentativa e Erro (Backtracking)23 de agosto de 2018 19 / 29
51. Tentativa e Erro
Exemplo: Passeio do Cavalo – C´odigo
O tabuleiro
class Cavalo {
int[] dx = { 2, 1,-1,-2,-2,-1, 1, 2};
int[] dy = { 1, 2, 2, 1,-1,-2,-2,-1};
int num, numQuad;
int[][] tab;
Cavalo(int num) {
this.num = num;
this.numQuad = num * num;
this.tab = new int[num][num];
}
boolean aceitavel(int x, int y) {
return(x >= 0 && x <= num-1 && y >= 0 && y <= num-1 &&
tab[x][y] == 0);
}
Norton Trevisan Romannorton@usp.br Aula 04 – T´ecnicas de Desenvolvimento de Algoritmos: Tentativa e Erro (Backtracking)23 de agosto de 2018 19 / 29
52. Tentativa e Erro
Exemplo: Passeio do Cavalo – C´odigo
Determina se (x, y) ´e
uma coordenada v´alida
class Cavalo {
int[] dx = { 2, 1,-1,-2,-2,-1, 1, 2};
int[] dy = { 1, 2, 2, 1,-1,-2,-2,-1};
int num, numQuad;
int[][] tab;
Cavalo(int num) {
this.num = num;
this.numQuad = num * num;
this.tab = new int[num][num];
}
boolean aceitavel(int x, int y) {
return(x >= 0 && x <= num-1 && y >= 0 && y <= num-1 &&
tab[x][y] == 0);
}
Norton Trevisan Romannorton@usp.br Aula 04 – T´ecnicas de Desenvolvimento de Algoritmos: Tentativa e Erro (Backtracking)23 de agosto de 2018 19 / 29
53. Tentativa e Erro
Exemplo: Passeio do Cavalo – C´odigo
boolean tenta(int i, int x, int y) {
int u,v; int k = 0;
boolean feito = (i > numQuad);
while (!feito && k < 8) {
u = x + dx[k]; v = y + dy[k];
if (aceitavel(u,v)) {
tab[u][v] = i;
feito = tenta(i+1, u, v);
if (!feito) {
tab[u][v] = 0;
}
}
k++;
}
return feito;
}
Norton Trevisan Romannorton@usp.br Aula 04 – T´ecnicas de Desenvolvimento de Algoritmos: Tentativa e Erro (Backtracking)23 de agosto de 2018 20 / 29
54. Tentativa e Erro
Exemplo: Passeio do Cavalo – C´odigo
Tenta mover o cavalo
a partir de (x, y) no
i-´esimo movimento
boolean tenta(int i, int x, int y) {
int u,v; int k = 0;
boolean feito = (i > numQuad);
while (!feito && k < 8) {
u = x + dx[k]; v = y + dy[k];
if (aceitavel(u,v)) {
tab[u][v] = i;
feito = tenta(i+1, u, v);
if (!feito) {
tab[u][v] = 0;
}
}
k++;
}
return feito;
}
Norton Trevisan Romannorton@usp.br Aula 04 – T´ecnicas de Desenvolvimento de Algoritmos: Tentativa e Erro (Backtracking)23 de agosto de 2018 20 / 29
55. Tentativa e Erro
Exemplo: Passeio do Cavalo – C´odigo
Coordenadas de
destino do movimento
boolean tenta(int i, int x, int y) {
int u,v; int k = 0;
boolean feito = (i > numQuad);
while (!feito && k < 8) {
u = x + dx[k]; v = y + dy[k];
if (aceitavel(u,v)) {
tab[u][v] = i;
feito = tenta(i+1, u, v);
if (!feito) {
tab[u][v] = 0;
}
}
k++;
}
return feito;
}
Norton Trevisan Romannorton@usp.br Aula 04 – T´ecnicas de Desenvolvimento de Algoritmos: Tentativa e Erro (Backtracking)23 de agosto de 2018 20 / 29
56. Tentativa e Erro
Exemplo: Passeio do Cavalo – C´odigo
Quantos dos poss´ıveis
movimentos a partir
de (x, y) j´a tentou
boolean tenta(int i, int x, int y) {
int u,v; int k = 0;
boolean feito = (i > numQuad);
while (!feito && k < 8) {
u = x + dx[k]; v = y + dy[k];
if (aceitavel(u,v)) {
tab[u][v] = i;
feito = tenta(i+1, u, v);
if (!feito) {
tab[u][v] = 0;
}
}
k++;
}
return feito;
}
Norton Trevisan Romannorton@usp.br Aula 04 – T´ecnicas de Desenvolvimento de Algoritmos: Tentativa e Erro (Backtracking)23 de agosto de 2018 20 / 29
57. Tentativa e Erro
Exemplo: Passeio do Cavalo – C´odigo
Diz se pode parar
(caso base: j´a marcou
todo o tabuleiro)
boolean tenta(int i, int x, int y) {
int u,v; int k = 0;
boolean feito = (i > numQuad);
while (!feito && k < 8) {
u = x + dx[k]; v = y + dy[k];
if (aceitavel(u,v)) {
tab[u][v] = i;
feito = tenta(i+1, u, v);
if (!feito) {
tab[u][v] = 0;
}
}
k++;
}
return feito;
}
Norton Trevisan Romannorton@usp.br Aula 04 – T´ecnicas de Desenvolvimento de Algoritmos: Tentativa e Erro (Backtracking)23 de agosto de 2018 20 / 29
58. Tentativa e Erro
Exemplo: Passeio do Cavalo – C´odigo
Enquanto n˜ao termi-
nou de marcar o tabu-
leiro todo, e ainda h´a
movimentos poss´ıveis
boolean tenta(int i, int x, int y) {
int u,v; int k = 0;
boolean feito = (i > numQuad);
while (!feito && k < 8) {
u = x + dx[k]; v = y + dy[k];
if (aceitavel(u,v)) {
tab[u][v] = i;
feito = tenta(i+1, u, v);
if (!feito) {
tab[u][v] = 0;
}
}
k++;
}
return feito;
}
Norton Trevisan Romannorton@usp.br Aula 04 – T´ecnicas de Desenvolvimento de Algoritmos: Tentativa e Erro (Backtracking)23 de agosto de 2018 20 / 29
59. Tentativa e Erro
Exemplo: Passeio do Cavalo – C´odigo
Calcula a coorde-
nada de destino
boolean tenta(int i, int x, int y) {
int u,v; int k = 0;
boolean feito = (i > numQuad);
while (!feito && k < 8) {
u = x + dx[k]; v = y + dy[k];
if (aceitavel(u,v)) {
tab[u][v] = i;
feito = tenta(i+1, u, v);
if (!feito) {
tab[u][v] = 0;
}
}
k++;
}
return feito;
}
Norton Trevisan Romannorton@usp.br Aula 04 – T´ecnicas de Desenvolvimento de Algoritmos: Tentativa e Erro (Backtracking)23 de agosto de 2018 20 / 29
60. Tentativa e Erro
Exemplo: Passeio do Cavalo – C´odigo
Se a coordenada for v´alida
boolean tenta(int i, int x, int y) {
int u,v; int k = 0;
boolean feito = (i > numQuad);
while (!feito && k < 8) {
u = x + dx[k]; v = y + dy[k];
if (aceitavel(u,v)) {
tab[u][v] = i;
feito = tenta(i+1, u, v);
if (!feito) {
tab[u][v] = 0;
}
}
k++;
}
return feito;
}
Norton Trevisan Romannorton@usp.br Aula 04 – T´ecnicas de Desenvolvimento de Algoritmos: Tentativa e Erro (Backtracking)23 de agosto de 2018 20 / 29
61. Tentativa e Erro
Exemplo: Passeio do Cavalo – C´odigo
Move o cavalo a ela
boolean tenta(int i, int x, int y) {
int u,v; int k = 0;
boolean feito = (i > numQuad);
while (!feito && k < 8) {
u = x + dx[k]; v = y + dy[k];
if (aceitavel(u,v)) {
tab[u][v] = i;
feito = tenta(i+1, u, v);
if (!feito) {
tab[u][v] = 0;
}
}
k++;
}
return feito;
}
Norton Trevisan Romannorton@usp.br Aula 04 – T´ecnicas de Desenvolvimento de Algoritmos: Tentativa e Erro (Backtracking)23 de agosto de 2018 20 / 29
62. Tentativa e Erro
Exemplo: Passeio do Cavalo – C´odigo
E tenta novo movimento
a partir dessa coordenada
boolean tenta(int i, int x, int y) {
int u,v; int k = 0;
boolean feito = (i > numQuad);
while (!feito && k < 8) {
u = x + dx[k]; v = y + dy[k];
if (aceitavel(u,v)) {
tab[u][v] = i;
feito = tenta(i+1, u, v);
if (!feito) {
tab[u][v] = 0;
}
}
k++;
}
return feito;
}
Norton Trevisan Romannorton@usp.br Aula 04 – T´ecnicas de Desenvolvimento de Algoritmos: Tentativa e Erro (Backtracking)23 de agosto de 2018 20 / 29
63. Tentativa e Erro
Exemplo: Passeio do Cavalo – C´odigo
Se a tentativa for infrut´ıfera
boolean tenta(int i, int x, int y) {
int u,v; int k = 0;
boolean feito = (i > numQuad);
while (!feito && k < 8) {
u = x + dx[k]; v = y + dy[k];
if (aceitavel(u,v)) {
tab[u][v] = i;
feito = tenta(i+1, u, v);
if (!feito) {
tab[u][v] = 0;
}
}
k++;
}
return feito;
}
Norton Trevisan Romannorton@usp.br Aula 04 – T´ecnicas de Desenvolvimento de Algoritmos: Tentativa e Erro (Backtracking)23 de agosto de 2018 20 / 29
64. Tentativa e Erro
Exemplo: Passeio do Cavalo – C´odigo
Descarta o movimento
boolean tenta(int i, int x, int y) {
int u,v; int k = 0;
boolean feito = (i > numQuad);
while (!feito && k < 8) {
u = x + dx[k]; v = y + dy[k];
if (aceitavel(u,v)) {
tab[u][v] = i;
feito = tenta(i+1, u, v);
if (!feito) {
tab[u][v] = 0;
}
}
k++;
}
return feito;
}
Norton Trevisan Romannorton@usp.br Aula 04 – T´ecnicas de Desenvolvimento de Algoritmos: Tentativa e Erro (Backtracking)23 de agosto de 2018 20 / 29
65. Tentativa e Erro
Exemplo: Passeio do Cavalo – C´odigo
passa ao pr´oximo
movimento poss´ıvel
boolean tenta(int i, int x, int y) {
int u,v; int k = 0;
boolean feito = (i > numQuad);
while (!feito && k < 8) {
u = x + dx[k]; v = y + dy[k];
if (aceitavel(u,v)) {
tab[u][v] = i;
feito = tenta(i+1, u, v);
if (!feito) {
tab[u][v] = 0;
}
}
k++;
}
return feito;
}
Norton Trevisan Romannorton@usp.br Aula 04 – T´ecnicas de Desenvolvimento de Algoritmos: Tentativa e Erro (Backtracking)23 de agosto de 2018 20 / 29
66. Tentativa e Erro
Exemplo: Passeio do Cavalo – C´odigo
define se o caminho a
partir de (x, y) teve
ou n˜ao teve sucesso
boolean tenta(int i, int x, int y) {
int u,v; int k = 0;
boolean feito = (i > numQuad);
while (!feito && k < 8) {
u = x + dx[k]; v = y + dy[k];
if (aceitavel(u,v)) {
tab[u][v] = i;
feito = tenta(i+1, u, v);
if (!feito) {
tab[u][v] = 0;
}
}
k++;
}
return feito;
}
Norton Trevisan Romannorton@usp.br Aula 04 – T´ecnicas de Desenvolvimento de Algoritmos: Tentativa e Erro (Backtracking)23 de agosto de 2018 20 / 29
67. Tentativa e Erro
Exemplo: Passeio do Cavalo – C´odigo
void imprime() {
for (int i = 0; i < num; i++) {
for (int j = 0; j < num; j++)
System.out.print(tab[i][j] + "t");
System.out.println("n");
}
}
void passeia(int x, int y) {
tab[x][y] = 1;
boolean feito = tenta(2, x, y);
if (feito)
imprime();
else
System.out.println("N~ao h´a passeio poss´ıvel");
}
Norton Trevisan Romannorton@usp.br Aula 04 – T´ecnicas de Desenvolvimento de Algoritmos: Tentativa e Erro (Backtracking)23 de agosto de 2018 21 / 29
68. Tentativa e Erro
Exemplo: Passeio do Cavalo – C´odigo
Inicia o passeio em (x, y)
void imprime() {
for (int i = 0; i < num; i++) {
for (int j = 0; j < num; j++)
System.out.print(tab[i][j] + "t");
System.out.println("n");
}
}
void passeia(int x, int y) {
tab[x][y] = 1;
boolean feito = tenta(2, x, y);
if (feito)
imprime();
else
System.out.println("N~ao h´a passeio poss´ıvel");
}
Norton Trevisan Romannorton@usp.br Aula 04 – T´ecnicas de Desenvolvimento de Algoritmos: Tentativa e Erro (Backtracking)23 de agosto de 2018 21 / 29
69. Tentativa e Erro
Exemplo: Passeio do Cavalo – C´odigo
Marca a posi¸c˜ao de
in´ıcio como visitada
void imprime() {
for (int i = 0; i < num; i++) {
for (int j = 0; j < num; j++)
System.out.print(tab[i][j] + "t");
System.out.println("n");
}
}
void passeia(int x, int y) {
tab[x][y] = 1;
boolean feito = tenta(2, x, y);
if (feito)
imprime();
else
System.out.println("N~ao h´a passeio poss´ıvel");
}
Norton Trevisan Romannorton@usp.br Aula 04 – T´ecnicas de Desenvolvimento de Algoritmos: Tentativa e Erro (Backtracking)23 de agosto de 2018 21 / 29
70. Tentativa e Erro
Exemplo: Passeio do Cavalo – C´odigo
E verifica os cami-
nhos a partir dela
void imprime() {
for (int i = 0; i < num; i++) {
for (int j = 0; j < num; j++)
System.out.print(tab[i][j] + "t");
System.out.println("n");
}
}
void passeia(int x, int y) {
tab[x][y] = 1;
boolean feito = tenta(2, x, y);
if (feito)
imprime();
else
System.out.println("N~ao h´a passeio poss´ıvel");
}
Norton Trevisan Romannorton@usp.br Aula 04 – T´ecnicas de Desenvolvimento de Algoritmos: Tentativa e Erro (Backtracking)23 de agosto de 2018 21 / 29
71. Tentativa e Erro
Exemplo: Passeio do Cavalo – C´odigo
Se achou a resposta, mostra
void imprime() {
for (int i = 0; i < num; i++) {
for (int j = 0; j < num; j++)
System.out.print(tab[i][j] + "t");
System.out.println("n");
}
}
void passeia(int x, int y) {
tab[x][y] = 1;
boolean feito = tenta(2, x, y);
if (feito)
imprime();
else
System.out.println("N~ao h´a passeio poss´ıvel");
}
Norton Trevisan Romannorton@usp.br Aula 04 – T´ecnicas de Desenvolvimento de Algoritmos: Tentativa e Erro (Backtracking)23 de agosto de 2018 21 / 29
72. Tentativa e Erro
Exemplo: Passeio do Cavalo – C´odigo
Sen˜ao, avisa que n˜ao
h´a resposta poss´ıvel
void imprime() {
for (int i = 0; i < num; i++) {
for (int j = 0; j < num; j++)
System.out.print(tab[i][j] + "t");
System.out.println("n");
}
}
void passeia(int x, int y) {
tab[x][y] = 1;
boolean feito = tenta(2, x, y);
if (feito)
imprime();
else
System.out.println("N~ao h´a passeio poss´ıvel");
}
Norton Trevisan Romannorton@usp.br Aula 04 – T´ecnicas de Desenvolvimento de Algoritmos: Tentativa e Erro (Backtracking)23 de agosto de 2018 21 / 29
73. Tentativa e Erro
Exemplo: Passeio do Cavalo – C´odigo
public static void main(String[] args) {
int n = Integer.parseInt(args[0]);
int x = Integer.parseInt(args[1]);
int y = Integer.parseInt(args[2]);
new Cavalo(n).passeia(x, y);
}
}
Norton Trevisan Romannorton@usp.br Aula 04 – T´ecnicas de Desenvolvimento de Algoritmos: Tentativa e Erro (Backtracking)23 de agosto de 2018 22 / 29
74. Tentativa e Erro
Exemplo: Passeio do Cavalo – Representa¸c˜ao
Est´a correto t[x][y] → (x, y)?
Norton Trevisan Romannorton@usp.br Aula 04 – T´ecnicas de Desenvolvimento de Algoritmos: Tentativa e Erro (Backtracking)23 de agosto de 2018 23 / 29
75. Tentativa e Erro
Exemplo: Passeio do Cavalo – Representa¸c˜ao
Est´a correto t[x][y] → (x, y)?
Mem´oria:
x
y
Norton Trevisan Romannorton@usp.br Aula 04 – T´ecnicas de Desenvolvimento de Algoritmos: Tentativa e Erro (Backtracking)23 de agosto de 2018 23 / 29
76. Tentativa e Erro
Exemplo: Passeio do Cavalo – Representa¸c˜ao
Est´a correto t[x][y] → (x, y)?
Mem´oria:
x
y
Ao somarmos algum dx a t[x][y], estaremos, na
verdade, “descendo” na vertical
Norton Trevisan Romannorton@usp.br Aula 04 – T´ecnicas de Desenvolvimento de Algoritmos: Tentativa e Erro (Backtracking)23 de agosto de 2018 23 / 29
77. Tentativa e Erro
Exemplo: Passeio do Cavalo – Representa¸c˜ao
Est´a correto t[x][y] → (x, y)?
Mem´oria:
x
y
Ent˜ao...
Ao somarmos algum dx a t[x][y], estaremos, na
verdade, “descendo” na vertical
Norton Trevisan Romannorton@usp.br Aula 04 – T´ecnicas de Desenvolvimento de Algoritmos: Tentativa e Erro (Backtracking)23 de agosto de 2018 23 / 29
78. Tentativa e Erro
Exemplo: Passeio do Cavalo – C´odigo
Se chamado com
java Cavalo 8 0 0
temos o seguinte
resultado:
1 60 39 34 31 18 9 64
38 35 32 61 10 63 30 17
59 2 37 40 33 28 19 8
36 49 42 27 62 11 16 29
43 58 3 50 41 24 7 20
48 51 46 55 26 21 12 15
57 44 53 4 23 14 25 6
52 47 56 45 54 5 22 13
Norton Trevisan Romannorton@usp.br Aula 04 – T´ecnicas de Desenvolvimento de Algoritmos: Tentativa e Erro (Backtracking)23 de agosto de 2018 24 / 29
79. Tentativa e Erro
Exemplo: Passeio do Cavalo – C´odigo
Se chamado com
java Cavalo 8 0 0
temos o seguinte
resultado:
1 60 39 34 31 18 9 64
38 35 32 61 10 63 30 17
59 2 37 40 33 28 19 8
36 49 42 27 62 11 16 29
43 58 3 50 41 24 7 20
48 51 46 55 26 21 12 15
57 44 53 4 23 14 25 6
52 47 56 45 54 5 22 13
Norton Trevisan Romannorton@usp.br Aula 04 – T´ecnicas de Desenvolvimento de Algoritmos: Tentativa e Erro (Backtracking)23 de agosto de 2018 24 / 29
80. Recurs˜ao com Tentativa e Erro
Recurs˜ao ´e a maneira mais natural de se implementar
tentativa e erro
Norton Trevisan Romannorton@usp.br Aula 04 – T´ecnicas de Desenvolvimento de Algoritmos: Tentativa e Erro (Backtracking)23 de agosto de 2018 25 / 29
81. Recurs˜ao com Tentativa e Erro
Recurs˜ao ´e a maneira mais natural de se implementar
tentativa e erro
Vamos relembrar nosso
fatorial(3):
long fatorial(long n) {
if (n==0) return(1);
return(n *
fatorial(n-1));
}
Norton Trevisan Romannorton@usp.br Aula 04 – T´ecnicas de Desenvolvimento de Algoritmos: Tentativa e Erro (Backtracking)23 de agosto de 2018 25 / 29
82. Recurs˜ao com Tentativa e Erro
Recurs˜ao ´e a maneira mais natural de se implementar
tentativa e erro
Vamos relembrar nosso
fatorial(3):
long fatorial(long n) {
if (n==0) return(1);
return(n *
fatorial(n-1));
}
retorna: ?n: 3
Ao chamarmos fatorial(3),
o m´etodo ´e empilhado
Norton Trevisan Romannorton@usp.br Aula 04 – T´ecnicas de Desenvolvimento de Algoritmos: Tentativa e Erro (Backtracking)23 de agosto de 2018 25 / 29
83. Recurs˜ao com Tentativa e Erro
Recurs˜ao ´e a maneira mais natural de se implementar
tentativa e erro
Vamos relembrar nosso
fatorial(3):
long fatorial(long n) {
if (n==0) return(1);
return(n *
fatorial(n-1));
}
retorna: ?n: 3
N˜ao ´e o caso base
Norton Trevisan Romannorton@usp.br Aula 04 – T´ecnicas de Desenvolvimento de Algoritmos: Tentativa e Erro (Backtracking)23 de agosto de 2018 25 / 29
84. Recurs˜ao com Tentativa e Erro
Recurs˜ao ´e a maneira mais natural de se implementar
tentativa e erro
Vamos relembrar nosso
fatorial(3):
long fatorial(long n) {
if (n==0) return(1);
return(n *
fatorial(n-1));
}
retorna: ?n: 3
retorna: ?n: 2
Ent˜ao nova chamada
´e feita e empilhada
Norton Trevisan Romannorton@usp.br Aula 04 – T´ecnicas de Desenvolvimento de Algoritmos: Tentativa e Erro (Backtracking)23 de agosto de 2018 25 / 29
85. Recurs˜ao com Tentativa e Erro
Recurs˜ao ´e a maneira mais natural de se implementar
tentativa e erro
Vamos relembrar nosso
fatorial(3):
long fatorial(long n) {
if (n==0) return(1);
return(n *
fatorial(n-1));
}
retorna: ?n: 3
retorna: ?n: 2
N˜ao ´e o caso base
Norton Trevisan Romannorton@usp.br Aula 04 – T´ecnicas de Desenvolvimento de Algoritmos: Tentativa e Erro (Backtracking)23 de agosto de 2018 25 / 29
86. Recurs˜ao com Tentativa e Erro
Recurs˜ao ´e a maneira mais natural de se implementar
tentativa e erro
Vamos relembrar nosso
fatorial(3):
long fatorial(long n) {
if (n==0) return(1);
return(n *
fatorial(n-1));
}
retorna: ?n: 3
retorna: ?n: 2
retorna: ?n: 1
Ent˜ao nova chamada
´e feita e empilhada
Norton Trevisan Romannorton@usp.br Aula 04 – T´ecnicas de Desenvolvimento de Algoritmos: Tentativa e Erro (Backtracking)23 de agosto de 2018 25 / 29
87. Recurs˜ao com Tentativa e Erro
Recurs˜ao ´e a maneira mais natural de se implementar
tentativa e erro
Vamos relembrar nosso
fatorial(3):
long fatorial(long n) {
if (n==0) return(1);
return(n *
fatorial(n-1));
}
retorna: ?n: 3
retorna: ?n: 2
retorna: ?n: 1
N˜ao ´e o caso base
Norton Trevisan Romannorton@usp.br Aula 04 – T´ecnicas de Desenvolvimento de Algoritmos: Tentativa e Erro (Backtracking)23 de agosto de 2018 25 / 29
88. Recurs˜ao com Tentativa e Erro
Recurs˜ao ´e a maneira mais natural de se implementar
tentativa e erro
Vamos relembrar nosso
fatorial(3):
long fatorial(long n) {
if (n==0) return(1);
return(n *
fatorial(n-1));
}
retorna: ?n: 3
retorna: ?n: 2
retorna: ?n: 1
retorna: ?n: 0
Ent˜ao nova chamada
´e feita e empilhada
Norton Trevisan Romannorton@usp.br Aula 04 – T´ecnicas de Desenvolvimento de Algoritmos: Tentativa e Erro (Backtracking)23 de agosto de 2018 25 / 29
89. Recurs˜ao com Tentativa e Erro
Recurs˜ao ´e a maneira mais natural de se implementar
tentativa e erro
Vamos relembrar nosso
fatorial(3):
long fatorial(long n) {
if (n==0) return(1);
return(n *
fatorial(n-1));
}
retorna: ?n: 3
retorna: ?n: 2
retorna: ?n: 1
retorna: 1n: 0
´E o caso base!
Norton Trevisan Romannorton@usp.br Aula 04 – T´ecnicas de Desenvolvimento de Algoritmos: Tentativa e Erro (Backtracking)23 de agosto de 2018 25 / 29
90. Recurs˜ao com Tentativa e Erro
Recurs˜ao ´e a maneira mais natural de se implementar
tentativa e erro
Vamos relembrar nosso
fatorial(3):
long fatorial(long n) {
if (n==0) return(1);
return(n *
fatorial(n-1));
}
retorna: ?n: 3
retorna: ?n: 2
retorna: ?n: 1
Desempilha, retornando 1.
E assim “volta” `a por¸c˜ao de
mem´oria no passo anterior
da recurs˜ao → backtracking
Norton Trevisan Romannorton@usp.br Aula 04 – T´ecnicas de Desenvolvimento de Algoritmos: Tentativa e Erro (Backtracking)23 de agosto de 2018 25 / 29
91. Recurs˜ao com Tentativa e Erro
Recurs˜ao ´e a maneira mais natural de se implementar
tentativa e erro
Vamos relembrar nosso
fatorial(3):
long fatorial(long n) {
if (n==0) return(1);
return(n *
fatorial(n-1));
}
retorna: ?n: 3
retorna: ?n: 2
retorna: 1n: 1
Faz 1 * 1
Norton Trevisan Romannorton@usp.br Aula 04 – T´ecnicas de Desenvolvimento de Algoritmos: Tentativa e Erro (Backtracking)23 de agosto de 2018 25 / 29
92. Recurs˜ao com Tentativa e Erro
Recurs˜ao ´e a maneira mais natural de se implementar
tentativa e erro
Vamos relembrar nosso
fatorial(3):
long fatorial(long n) {
if (n==0) return(1);
return(n *
fatorial(n-1));
}
retorna: ?n: 3
retorna: ?n: 2
Desempilha, retor-
nando 1 → backtracking
Norton Trevisan Romannorton@usp.br Aula 04 – T´ecnicas de Desenvolvimento de Algoritmos: Tentativa e Erro (Backtracking)23 de agosto de 2018 25 / 29
93. Recurs˜ao com Tentativa e Erro
Recurs˜ao ´e a maneira mais natural de se implementar
tentativa e erro
Vamos relembrar nosso
fatorial(3):
long fatorial(long n) {
if (n==0) return(1);
return(n *
fatorial(n-1));
}
retorna: ?n: 3
retorna: 2n: 2
Faz 2 * 1
Norton Trevisan Romannorton@usp.br Aula 04 – T´ecnicas de Desenvolvimento de Algoritmos: Tentativa e Erro (Backtracking)23 de agosto de 2018 25 / 29
94. Recurs˜ao com Tentativa e Erro
Recurs˜ao ´e a maneira mais natural de se implementar
tentativa e erro
Vamos relembrar nosso
fatorial(3):
long fatorial(long n) {
if (n==0) return(1);
return(n *
fatorial(n-1));
}
retorna: ?n: 3
Desempilha, retor-
nando 2 → backtracking
Norton Trevisan Romannorton@usp.br Aula 04 – T´ecnicas de Desenvolvimento de Algoritmos: Tentativa e Erro (Backtracking)23 de agosto de 2018 25 / 29
95. Recurs˜ao com Tentativa e Erro
Recurs˜ao ´e a maneira mais natural de se implementar
tentativa e erro
Vamos relembrar nosso
fatorial(3):
long fatorial(long n) {
if (n==0) return(1);
return(n *
fatorial(n-1));
}
retorna: 6n: 3
Faz 3 * 2
Norton Trevisan Romannorton@usp.br Aula 04 – T´ecnicas de Desenvolvimento de Algoritmos: Tentativa e Erro (Backtracking)23 de agosto de 2018 25 / 29
96. Recurs˜ao com Tentativa e Erro
Recurs˜ao ´e a maneira mais natural de se implementar
tentativa e erro
Vamos relembrar nosso
fatorial(3):
long fatorial(long n) {
if (n==0) return(1);
return(n *
fatorial(n-1));
} Desempilha, retornando 6
Norton Trevisan Romannorton@usp.br Aula 04 – T´ecnicas de Desenvolvimento de Algoritmos: Tentativa e Erro (Backtracking)23 de agosto de 2018 25 / 29
97. Recurs˜ao com Tentativa e Erro
Se conseguirmos codificar o problema de modo a
que:
Cada nova decis˜ao seja uma chamada recursiva
Cada backtracking corresponda a voltar de uma chamada
recursiva
Ent˜ao a solu¸c˜ao do problema, se feita
recursivamente, naturalmente gerenciar´a o
mecanismo de tentativa e erro
Norton Trevisan Romannorton@usp.br Aula 04 – T´ecnicas de Desenvolvimento de Algoritmos: Tentativa e Erro (Backtracking)23 de agosto de 2018 26 / 29
98. Recurs˜ao com Tentativa e Erro
E se n˜ao pudermos/quisermos usar recurs˜ao?
Norton Trevisan Romannorton@usp.br Aula 04 – T´ecnicas de Desenvolvimento de Algoritmos: Tentativa e Erro (Backtracking)23 de agosto de 2018 27 / 29
99. Recurs˜ao com Tentativa e Erro
E se n˜ao pudermos/quisermos usar recurs˜ao?
Precisaremos de um mecanismo que nos permita:
Norton Trevisan Romannorton@usp.br Aula 04 – T´ecnicas de Desenvolvimento de Algoritmos: Tentativa e Erro (Backtracking)23 de agosto de 2018 27 / 29
100. Recurs˜ao com Tentativa e Erro
E se n˜ao pudermos/quisermos usar recurs˜ao?
Precisaremos de um mecanismo que nos permita:
Registrar cada decis˜ao tomada
Norton Trevisan Romannorton@usp.br Aula 04 – T´ecnicas de Desenvolvimento de Algoritmos: Tentativa e Erro (Backtracking)23 de agosto de 2018 27 / 29
101. Recurs˜ao com Tentativa e Erro
E se n˜ao pudermos/quisermos usar recurs˜ao?
Precisaremos de um mecanismo que nos permita:
Registrar cada decis˜ao tomada
Voltar `a decis˜ao imediatamente anterior a cada decis˜ao
tomada, para que possamos fazer o backtracking em caso de
falha
Ou seja, precisamos registrar tamb´em a ordem em que foram
tomadas
Norton Trevisan Romannorton@usp.br Aula 04 – T´ecnicas de Desenvolvimento de Algoritmos: Tentativa e Erro (Backtracking)23 de agosto de 2018 27 / 29
102. Recurs˜ao com Tentativa e Erro
E se n˜ao pudermos/quisermos usar recurs˜ao?
Precisaremos de um mecanismo que nos permita:
Registrar cada decis˜ao tomada
Voltar `a decis˜ao imediatamente anterior a cada decis˜ao
tomada, para que possamos fazer o backtracking em caso de
falha
Ou seja, precisamos registrar tamb´em a ordem em que foram
tomadas
Um mecanismo assim ´e fornecido por uma pilha:
Norton Trevisan Romannorton@usp.br Aula 04 – T´ecnicas de Desenvolvimento de Algoritmos: Tentativa e Erro (Backtracking)23 de agosto de 2018 27 / 29
103. Recurs˜ao com Tentativa e Erro
E se n˜ao pudermos/quisermos usar recurs˜ao?
Precisaremos de um mecanismo que nos permita:
Registrar cada decis˜ao tomada
Voltar `a decis˜ao imediatamente anterior a cada decis˜ao
tomada, para que possamos fazer o backtracking em caso de
falha
Ou seja, precisamos registrar tamb´em a ordem em que foram
tomadas
Um mecanismo assim ´e fornecido por uma pilha:
Empilhamos cada decis˜ao tomada
Norton Trevisan Romannorton@usp.br Aula 04 – T´ecnicas de Desenvolvimento de Algoritmos: Tentativa e Erro (Backtracking)23 de agosto de 2018 27 / 29
104. Recurs˜ao com Tentativa e Erro
E se n˜ao pudermos/quisermos usar recurs˜ao?
Precisaremos de um mecanismo que nos permita:
Registrar cada decis˜ao tomada
Voltar `a decis˜ao imediatamente anterior a cada decis˜ao
tomada, para que possamos fazer o backtracking em caso de
falha
Ou seja, precisamos registrar tamb´em a ordem em que foram
tomadas
Um mecanismo assim ´e fornecido por uma pilha:
Empilhamos cada decis˜ao tomada
Em caso de falha, desempilhamos → voltamos `a decis˜ao
imediatamente anterior
Norton Trevisan Romannorton@usp.br Aula 04 – T´ecnicas de Desenvolvimento de Algoritmos: Tentativa e Erro (Backtracking)23 de agosto de 2018 27 / 29
105. Recurs˜ao com Tentativa e Erro
E se n˜ao pudermos/quisermos usar recurs˜ao?
Note que isso ´e
exatamente o que a
pilha de recurs˜ao faz
Norton Trevisan Romannorton@usp.br Aula 04 – T´ecnicas de Desenvolvimento de Algoritmos: Tentativa e Erro (Backtracking)23 de agosto de 2018 28 / 29
106. Recurs˜ao com Tentativa e Erro
E se n˜ao pudermos/quisermos usar recurs˜ao?
Note que isso ´e
exatamente o que a
pilha de recurs˜ao faz
decis˜ao 1
Registramos cada decis˜ao tomada
Norton Trevisan Romannorton@usp.br Aula 04 – T´ecnicas de Desenvolvimento de Algoritmos: Tentativa e Erro (Backtracking)23 de agosto de 2018 28 / 29
107. Recurs˜ao com Tentativa e Erro
E se n˜ao pudermos/quisermos usar recurs˜ao?
Note que isso ´e
exatamente o que a
pilha de recurs˜ao faz
decis˜ao 1
decis˜ao 2
Registramos cada decis˜ao tomada
Norton Trevisan Romannorton@usp.br Aula 04 – T´ecnicas de Desenvolvimento de Algoritmos: Tentativa e Erro (Backtracking)23 de agosto de 2018 28 / 29
108. Recurs˜ao com Tentativa e Erro
E se n˜ao pudermos/quisermos usar recurs˜ao?
Note que isso ´e
exatamente o que a
pilha de recurs˜ao faz
decis˜ao 1
decis˜ao 2
decis˜ao 3
Registramos cada decis˜ao tomada
Norton Trevisan Romannorton@usp.br Aula 04 – T´ecnicas de Desenvolvimento de Algoritmos: Tentativa e Erro (Backtracking)23 de agosto de 2018 28 / 29
109. Recurs˜ao com Tentativa e Erro
E se n˜ao pudermos/quisermos usar recurs˜ao?
Note que isso ´e
exatamente o que a
pilha de recurs˜ao faz
decis˜ao 1
decis˜ao 2
decis˜ao 3
decis˜ao 4
Registramos cada decis˜ao tomada
Norton Trevisan Romannorton@usp.br Aula 04 – T´ecnicas de Desenvolvimento de Algoritmos: Tentativa e Erro (Backtracking)23 de agosto de 2018 28 / 29
110. Recurs˜ao com Tentativa e Erro
E se n˜ao pudermos/quisermos usar recurs˜ao?
Note que isso ´e
exatamente o que a
pilha de recurs˜ao faz
decis˜ao 1
decis˜ao 2
decis˜ao 3
decis˜ao 4
Em caso de falha, desempilha-
mos a decis˜ao problem´atica
Norton Trevisan Romannorton@usp.br Aula 04 – T´ecnicas de Desenvolvimento de Algoritmos: Tentativa e Erro (Backtracking)23 de agosto de 2018 28 / 29
111. Recurs˜ao com Tentativa e Erro
E se n˜ao pudermos/quisermos usar recurs˜ao?
Note que isso ´e
exatamente o que a
pilha de recurs˜ao faz
decis˜ao 1
decis˜ao 2
decis˜ao 3
Voltando `a decis˜ao imedi-
atamente anterior a esta
Norton Trevisan Romannorton@usp.br Aula 04 – T´ecnicas de Desenvolvimento de Algoritmos: Tentativa e Erro (Backtracking)23 de agosto de 2018 28 / 29
112. Recurs˜ao com Tentativa e Erro
E se n˜ao pudermos/quisermos usar recurs˜ao?
Note que isso ´e
exatamente o que a
pilha de recurs˜ao faz
decis˜ao 1
decis˜ao 2
decis˜ao 3
decis˜ao 5
E podendo ent˜ao tomar outra
decis˜ao no lugar da que falhou
Norton Trevisan Romannorton@usp.br Aula 04 – T´ecnicas de Desenvolvimento de Algoritmos: Tentativa e Erro (Backtracking)23 de agosto de 2018 28 / 29
113. Referˆencias
Ziviani, Nivio. Projeto de Algoritmos: com implementa¸c˜oes
em Java e C++. Cengage. 2007.
Gersting, Judith L. Fundamentos Matem´aticos para a Ciˆencia
da Computa¸c˜ao. 3a ed. LTC. 1993.
Norton Trevisan Romannorton@usp.br Aula 04 – T´ecnicas de Desenvolvimento de Algoritmos: Tentativa e Erro (Backtracking)23 de agosto de 2018 29 / 29