Java - echar un vistazo a este codigo simple de recursividad por favor!

   
Vista:

echar un vistazo a este codigo simple de recursividad por favor!

Publicado por diegomy (1 intervención) el 12/03/2014 17:03:57
Hola buenas! he escrito este codigo que es el tipico caballo por todas las casillas,que funciona. al pasarlo del papel tuve un problema que logre solucionar, lo he explicado en el codigo, es que cuando, despues de terminar un proceso recursivo donde no pudo avanzar, regresa al anterior, pero en vez de regresar las variables a las que tenia, se queda con las de la ultima pasada fallida. no se si me explico bien, aqui el codigo:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
public class PaseoDelCaballo
{
	static int [][] tablero = new int [8][8]; //matriz donde se guardaran los movimientos
	static int salida; //bandera para salir de la recursividad
	public static void mover (int actX, int actY, int movA)
	{
		int futX=actX, futY=actY, sigMov = movA ; //al volver un paso atras en el proceso no recuperaba el valor de las variables, lo solucione declarandolas...
		if (movA ==64) //tablero lleno
		{
			imprimirTablero();
			salida=-1;
		}
		else
		{
			for ( int x = -2; x <= 2; x++)
			{
				if (salida==-1) break;	//salida si se encontro una solucion
				for ( int y = -2 ; y <= 2; y++)
				{
					if (salida==-1) break; 	//salida si se encontro una solucion
					futX = actX; futY = actY; sigMov = movA ; 	//... y recuperando los valores originales en cada repeticion
					if ( movCaballo(x,y))
					{
						if (esValido ( futX + x, futY + y ))
						{
							futX += x;
							futY += y;
							tablero [ futX ] [ futY ] = ++sigMov;
							mover ( futX, futY,sigMov);
						}
					}
					else
						if ( x == 2 & y == 2)
							tablero [actX][actY] = 0;
				}
			}
		}
	}
	static boolean movCaballo (int x, int y)
	{
		if ((Math.abs(x)==2 ^ Math.abs(y)==2) & (Math.abs(x) != Math.abs(y)) & Math.abs(x) != 0 & Math.abs(y) != 0)
			return true;
		else
			return false;
	}
	static boolean esValido (int x, int y)
	{
		if ((((x >= 0 & x <= 7) & (y >= 0 & y <= 7)) && tablero[x][y] == 0))
			return true;
		else
			return false;
	}
 
	static void imprimirTablero ()
	{
		for (int [] fila : tablero)
		{
			System.out.print(" -----------------------------------------------\n");
			for (int columna : fila)
				System.out.printf ("|%4d ", columna);
			System.out.println ("|");
		}
		System.out.print(" -----------------------------------------------\n");
	}
	public static void main (String[] args)
	{
		tablero[0][0]=1;
		mover (0,0,1);
	}
}
se que esta un poco desordenado y estoy seguro de que podria ser mas claro. tambien me gustaria poder implementar mas el uso de objetos, pero es que recien empiezo en java. pues si alguien me ayuda a mejorar y ayudarme a ver errores que mejorar y convenciones omitidas le agradeceria muchisimo
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder