Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
7 Backtracking
• Caso a escolha não possa levar a uma possível solução então todas
as opções que incluem aquela escolha podem ser ignoradas, isto é,
não precisam ser avaliadas;
(a) a partir da posição corrente, selecione uma posição possível (que ainda
não foi escolhida/avaliada)
(b) se a posição é aceitável, isto é, se ainda não foi visitada, registre-a
como “posição visitada”
(c) se ainda há posições a visitar tente um próximo movimento a partir da
posição escolhida no item (b)
(d) se a posição escolhida no item (b) não levou a uma solução, remarque a
posição como não visitada
(e) repita os passos acima até que uma solução seja obtida ou até que não
haja mais escolhas a partir da posição corrente
k dx dy k dx dy
1 2 1 5 –2 –1
2 1 2 6 –1 –2
3 –1 2 7 1 –2
4 –2 1 8 2 –1
2
• Programa
/* +---------------------------------------------+
| Programa que determina o passeio do cavalo |
| num tabuleiro de xadrez de dimensões n x n |
| onde n é fornecido pelo usuário |
| Implementado por Marcus Vinícius A. Andrade |
| em 28/02/02 |
+---------------------------------------------+ */
#include <iostream.h>
#include <iomanip.h>
int n;
struct desloc { // deslocamentos nas direções x e y
int dx;
int dy;
};
k=0;
do {
q=false;
u = x+mov_cav[k].dx;
v = y+mov_cav[k].dy;
k=k+1;
3
// verifica se a posição é válida no tabuleiro
// e se a posição ainda não foi visitada
if (0 <= u && u < n && 0 <= v && v < n
&& T[u][v]==0) {
T[u][v]=i; // registra a visita
if (i < nsq) {
// ainda há posições no tabuleiro não visitadas
q = tente_mov(i+1,u,v);
if (!q) // movimento sem sucesso
T[u][v]=0; // remova o registo de "visita"
}
else q=true;
}
} while (!q && k<8);
return q;
}
void main()
{ bool ok;
4
T[0][0]=1;
ok=tente_mov(2,0,0);
if (ok) {
cout.setf(ios::right);
for (int i=0; i < n; i++) {
for (int j=0; j < n; j++)
cout << setw(4) << T[i][j] << " ";
cout << endl;
}
}
else
cout << "Nao ha solucao \n";
}
5
• Estrutura geral de um algoritmo usando Backtracking
Exemplo:
6
Observações:
• Pela modelagem adotada nunca haverá mais de uma rainha numa mesma
linha ou numa mesma coluna
http://www.bhopalnet.com/eightq.htm
http://homepage.tinet.ie/~pdpals/8queens.htm