Você está na página 1de 3

Algoritmos de Tentativa e Erro

Prof. Wladimir Arajo Tavares


A recursividade pode ser usada para resolver problemas cuja soluo tentar todas as alternativas possveis. A
idia para algoritmos tentativa e erro decompor o problema em um nmero finitos de sub-tarefas parciais que
devem ser exploradas exaustivamente. Isso significa que devemos testar todas as possibilidades de resultados
em um problema fim de descobrir qual o melhor resultado para esse. Costumam ser algoritmos com uma
implementao simples, porm com uma complexidade geralmente elevada.
Exemplo: Passeio de um cavalo no tabuleiro de xadrez
Dado um tabuleiro com n x n posies, o cavalo movimenta-se segundo as regras do xadrez.

A partir da posio inicial (x
0
,y
0
), o problema consiste em encontrar, se existir, um passeio do valo com n
2
1
movimentos, tal que todos os pontos do tabuleiro so visitados uma nica vez. Um caminho para resolver o
problema considerar a possibilidade de realizar o prximo movimento ou verificar que ele no possvel.
Algoritmo Bsico

Um exemplo de uma soluo para o problema do passeio de um cavalo para o tabuleiro 8x8.

#include <stdio.h>
int t[8][8],a[8],b[8];
void imprime(){
int i,j;
for(i=0;i<8;i++){ for(j=0;j<8;j++){printf("%3d",t[i][j]);} printf("\n");}
}
int cavalo(int i, int x, int y){
int u,v,k,q;
if(i==64){ imprime(); return 1;}
//executa movimentos
for(k=0;k<8;k++){
u = x + a[k]; v = y + b[k];
//testa limites do tabuleiro
if( (u>=0 && u<=7) && (v>=0 && v<=7)){
if(t[u][v]==0){
t[u][v]=i;
q = cavalo(i+1,u,v);
if(q==0) t[u][v]=0; else return 1;
}
}
}
return 0;
}
int main(){
//inicializao dos deslocamentos dos movimentos
a[0]=2;a[1]=1;a[2]=-1;a[3]=-2;
b[0]=1;b[1]=2;b[2]=2;b[3]=1;

a[4]=-2;a[5]=-1;a[6]=1;a[7]=2;
b[4]=-1;b[5]=-2;b[6]=-2;b[7]=-1;
memset(t,0,sizeof(t));
cont =1;
t[0][0]=1;
cavalo(2,0,0);
system("PAUSE");
}


http://www.spoj.pl/problems/STABLEMP/

Você também pode gostar