Exercícios de Fixação 05 - Backtracking - Gabarito
6 pág.

Exercícios de Fixação 05 - Backtracking - Gabarito


DisciplinaAnálise de Algoritmos191 materiais713 seguidores
Pré-visualização1 página
ANÁLISE DE ALGORITMOS
Bacharelado em Ciências da Computação
Lista de Exercícios de Fixação 05
Backtracking
1. [Prática em Laboratório] Neste exercício, vamos aplicar backtracking ao problema do passeio do
cavalo no tabuleiro de xadrez. Dado um tabuleiro com n x n posições, o cavalo se movimenta
segundo as regras do xadrez, ou seja, em \u2018L\u2019. A partir de uma posição inicial (x 0, y0), o problema
consiste em encontrar, se existir, um passeio do cavalo com n2 \u2013 1
movimentos, visitando todos os pontos do tabuleiro uma única vez. 
Podemos pensar no tabuleiro como uma matriz n x n e, para cada
posição, podemos indicar uma das situações:
\u2022 t[x, y] = 0, se <x, y> não foi visitada;
\u2022 t[x, y] = i, se <x, y> é visitada no i-ésimo movimento, onde 1 \u2264 i \u2264 n2.
Sendo assim, com base no algoritmo backtracking genérico, a seguir, podemos
pensar em uma implementação para solucionar o problema do passeio do cavalo.
Segue a implementação, em Java, de uma possível solução para o problema.
public class PasseioDoCavalo { 
 //dx e dy usados para calcular as coordenadas dos movimentos possíveis
 final int[] dx = {2, 1, -1, -2, -2, -1, 1, 2}; 
 final int[] dy = {1, 2, 2, 1, -1, -2, -2, -1};
 
 final int n; //número de posições do tabuleiro
 final int nCasas; //número total de casas
 int[][] tabuleiro;
1
ANÁLISE DE ALGORITMOS
Bacharelado em Ciências da Computação
 
 public PasseioDoCavalo(int n) {
 this.n = n;
 this.nCasas = n * n;
 this.tabuleiro = new int[n][n];
 }
 
 boolean ehAceitavel(int x, int y) { 
 //é aceitável se estiver dentro do tabuleiro e a se casa não foi visitada
 boolean result = (x >= 0 && x <= n - 1);
 result = result && (y >= 0 && y <= n - 1);
 result = result && (tabuleiro[x][y] == 0);
 return result;
 }
 
 //tenta o i-ésimo movimento em (x, y) 
 boolean tentaMovimento(int i, int x, int y) { 
 //Verifica a quantidade de movimentos
 boolean done = (i > nCasas);
 int k = 0;
 int u, v; //<u, v> é posição de destino e <x, y> é a posição atual
 while (!done && k < 8) {
 //u e v são as coordenadas dos 8 movimentos possíveis em volta do cavalo
 u = x + dx[k];
 v = y + dy[k];
 if (ehAceitavel(u, v)) {
 tabuleiro[u][v] = i;
 done = tentaMovimento(i + 1, u, v); //tenta outro movimento
 if (!done) 
 tabuleiro[u][v] = 0; //sem sucesso. Descarta movimento
 }
 k = k + 1; //passa ao próximo movimento possível
 }
 return done;
 } 
 void mostraPasseio (int x, int y) { 
 //mostra todos os movimentos a partir de (x, y)
 tabuleiro[x][y] = 1;
2
ANÁLISE DE ALGORITMOS
Bacharelado em Ciências da Computação
 boolean done = tentaMovimento(2, x, y);
 if (done) {
 for (int i = 0; i < n; i++) {
 for (int j = 0; j < n; j++) {
 System.out.print(tabuleiro[i][j] + &quot; &quot;);
 }
 System.out.println();
 }
 } else {
 System.out.println(&quot;Não há passeio possível&quot;);
 }
 }
 
 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 PasseioDoCavalo(n).mostraPasseio(x, y); 
 } 
}
a. Execute o código-fonte e observe a saída. O que ela representa?
b. Qual é a complexidade computacional da solução?
c. Qual é a restrição aplicada e onde ela é utilizada, no código, para indicar backtracking?
2. Como o backtracking consegue efetuar uma busca eficiente, apesar de não ser exaustiva?
Porque a técnica backtracking é um refinamento do algoritmo de busca por força bruta (ou
enumeração exaustiva), no qual boa parte do espaço de soluções pode ser eliminada sem ser
explicitamente examinada.
3. Considere a seguinte fórmula booleana e demonstre o resultado da aplicação da técnica backtracking
para o problema da satisfatibilidade (SAT).
3
\ue09ex\u2228y\u2228z \ue09f\ue09ex\u2228y \ue09f\ue09ey\u2228z \ue09f\ue09e z\u2228 x \ue09f\ue09ex\u2228y\u2228z \ue09f
ANÁLISE DE ALGORITMOS
Bacharelado em Ciências da Computação
Apresente o passo-a-passo.
Lembremos que fazemos backtracking quando uma cláusula é violada.
4. Um arranjo booleano M[1..n,1..n] representa um labirinto quadrado. Estando em um
determinado ponto do labirinto é possível se movimentar para pontos adjacentes na mesma
linha ou mesma coluna. Se M[i, j] é True, é possível passar pelo ponto (i, j); se M[i, j] é
False, não é possível passar pelo ponto (i,j). É possível usar uma solução por backtracking
que encontra um caminho, se existir, do ponto (1,1) para o ponto (n,n). A seguir,
encontramos um exemplo de um labirinto 5x5. Defina restrições para a sua solução de
backtracking e monte a árvore de espaço de estados, indicando a solução do exemplo.
4
x = 0x = 1
 (x V y V z)(x V ~y)(y V ~z)(z V ~x)(~x V 
~y V ~z)
(y V ~z)(z)(~y V ~z)
z = 1 z = 0
 (y)(~y)
y = 1 y = 0
 ()
Cláusula 
violada
Back
track
ing
 ()
Cláusula 
violada
Ba
ckt
rac
kin
g
 (y)()
Cláusula 
violada
Ba
ckt
rac
kin
g
 (y V z)(~y)(y V 
~z)
 ()
y = 0y = 1
Cláusula 
violada
Bac
ktra
ckin
g
 (z)(~z)
z = 0
z = 1
()
()
Cláusula 
violada
Cláusula 
violadaBa
ckt
rac
kin
g
ANÁLISE DE ALGORITMOS
Bacharelado em Ciências da Computação
Sugestão de solução. Restrições: Seja (i,j) a posição em cada célula do labirinto, incrementar i \u2192
andar para a direita; decrementar i \u2192 andar para a esquerda; incrementar j \u2192 andar descendo;
decrementar j \u2192 andar subindo. Iniciamos no (1,1), sempre tentando descer incrementando j, se o
quadrado for falso, tentaremos andar para direita incrementando i, se não for possível iremos para
esquerda. Portanto, a árvore de estados pode ser representada comos segue.
5
ANÁLISE DE ALGORITMOS
Bacharelado em Ciências da Computação
5. Ajude um rato a encontrar um pedaço de queijo no labirinto, a seguir.
Um labirinto desses pode ser representado por uma matriz retangular L, cujo elemento lij vale 0 ou
-1 conforme a casa correspondente do labirinto seja uma passagem livre ou uma parede,
respectivamente. É possível aplicar backtracking ao problema? Justifique. Em caso positivo, defina
as restrições a serem consideradas para a solução. 
Sugestão de solução. Restrições: Seja (i,j) a posição em cada célula do labirinto, incrementar i \u2192
andar para a direita; decrementar i \u2192 andar para a esquerda; incrementar j \u2192 andar descendo;
decrementar j \u2192 andar subindo. Iniciamos no (1,1), sempre tentando descer incrementando j, se o
quadrado for falso, tentaremos andar para direita incrementando i, se não for possível iremos para
esquerda.
6
	Lista de Exercícios de Fixação 05