Foros del Web » Programación para mayores de 30 ;) » C/C++ »

ayuda con backtracking

Estas en el tema de ayuda con backtracking en el foro de C/C++ en Foros del Web. Buenas, les cuento q estoy aprendiendo la tecnica del backtracking y me he encontrado q no es tan simple como parecia jeje. Cualquier material que ...
  #1 (permalink)  
Antiguo 19/08/2007, 23:13
 
Fecha de Ingreso: septiembre-2006
Ubicación: Montevideo
Mensajes: 46
Antigüedad: 18 años, 3 meses
Puntos: 1
ayuda con backtracking

Buenas,

les cuento q estoy aprendiendo la tecnica del backtracking y me he encontrado q no es tan simple como parecia jeje. Cualquier material que sepan pueda ubicar por Internet seria util, he dado vueltas pero hay pocos 'buenos' ejemplos.

Un problema q no he podido resolver seria el sig.

Supongan q tengo la sig matriz:

Mapa m = {
{1,1,1,1,1},
{0,1,1,0,1},
{0,0,1,0,1},
{0,0,1,0,1},
{0,0,1,0,1}};


suponiendo que los unos fueran tierra y los ceros agua, se me pide devolver la longitud del camino mas corto entre 2 puntos. Los movimientos posibles son arriba, abajo, izquierda, derecha, no se permite mover oblicuamente. Se pide q utilice backtracking y que devuelva -1 en el caso que no exista un camino posible.

La firma de la funcion seria algo asi:

int longitudCaminoMasCorto(Mapa m, int n, int i1, int j1, int i2, int j2);

En el ejemplo si llamo a la funcion asi:

long = longitudCaminoMasCorto(m,0,0,0,4,4)

Le estoy pidiendo q me devuelva el camino mas corto entre la esq superior izquierda (0,0) y la esquina inferior derecha (4,4). Me tendria q devolver 9.

cuando hay 2 caminos posibles, como puedo luego discernir cual es el correcto? y segun el codigo que hice hasta ahora y que dejo mas abajo no puedo devolver -1.

alguna ayuda??

/*CODIGO*/
int longitudCaminoMasCorto(Mapa m, int n, int i1, int j1, int i2, int j2){

//Arrays de adiciones de X e Y al moverme por el mapa.
int X[4] = {1,0,-1,0};
int Y[4] = {0,-1,0,1};

//Si pertenece al mapa ...
if(perteneceAlMapa(i1,j1)){

//si es tierra...
if(m[i1][j1] == 1){

//marco como visitada.
m[i1][j1] = 2;
//agrego 1 a la longitud del camino
n += 1;

//es el destino?
if((i1 == i2) && (j1 == j2)){

//devuelvo n.
return n;

//de lo contrario pregunto por CADA UNA de las alternativas...
}else{

//si la alternativa pertenece al mapa y no la visite
//llamo a esta funcion desde la posicion alternativa
if((perteneceAlMapa(i1+X[0],j1+Y[0])) && (m[i1+X[0]][j1+Y[0]] != 2)){
n = longitudCaminoMasCorto(m, n, i1+X[0], j1+Y[0], i2, j2);
};
if((perteneceAlMapa(i1+X[1],j1+Y[1])) && (m[i1+X[1]][j1+Y[1]] != 2)){
n = longitudCaminoMasCorto(m, n, i1+X[1], j1+Y[1], i2, j2);
};
if((perteneceAlMapa(i1+X[2],j1+Y[2])) && (m[i1+X[2]][j1+Y[2]] != 2)){
n = longitudCaminoMasCorto(m, n, i1+X[2], j1+Y[2], i2, j2);
};
if((perteneceAlMapa(i1+X[3],j1+Y[3])) && (m[i1+X[3]][j1+Y[3]] != 2)){
n = longitudCaminoMasCorto(m, n, i1+X[3], j1+Y[3], i2, j2);
};
}
}
}

return n;

}

/*FIN CODIGO*/

Última edición por chelix; 20/08/2007 a las 03:42
  #2 (permalink)  
Antiguo 20/08/2007, 03:20
Avatar de cris_maco  
Fecha de Ingreso: abril-2007
Ubicación: Salamanca
Mensajes: 254
Antigüedad: 17 años, 8 meses
Puntos: 0
Re: ayuda con backtracking

yo cuando estudie backtracking lo hice con el problema de las 8 reinas, el salto del caballo y la mochila.
encontre esto por ahi:
http://www.algoritmia.net/articles.php?id=33
http://dis.um.es/~ginesgm/temas/tema6-2/index.htm
  #3 (permalink)  
Antiguo 20/08/2007, 08:18
 
Fecha de Ingreso: septiembre-2006
Ubicación: Montevideo
Mensajes: 46
Antigüedad: 18 años, 3 meses
Puntos: 1
Re: ayuda con backtracking

muchas gracias por los links, estan muy buenos de verdad,

me vienen barbaro para seguir aprendiendo,
igual cualkier idea q tengan con respecto al codigo del ejemplo siempre sirve tmb
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 18:00.