elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Trabajando con las ramas de git (tercera parte)


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  AYUDA CON RECURSIVIDAD
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: 1 [2] Ir Abajo Respuesta Imprimir
Autor Tema: AYUDA CON RECURSIVIDAD  (Leído 5,614 veces)
MAFUS


Desconectado Desconectado

Mensajes: 1.603



Ver Perfil
Re: AYUDA CON RECURSIVIDAD
« Respuesta #10 en: 9 Enero 2018, 16:04 pm »

Siguiendo tus premisas he hecho lo siguiente. Decir que no está probado y puede contener fallos.
Código
  1. void FncOpenPoint(Tablero Partida, int fil, int col) {
  2.    // Configuro los límites de búsqueda
  3.    int inicio_fil = fil==0? 0 : -1; // Si ya estoy arriba no debo mirar más arriba
  4.    int fin_fil = fil==FIL-1? 0 : 1; // Si ya estoy abajo no debo mirar más abajo
  5.    int inicio_col = col==0? 0 : -1; // Si ya estoy a la izquierda no debo mirar más a la izquierda
  6.    int fin_col = col==COL-1? 0 : 1; // Si ya estoy a la derecha no debo mirar más a la derecha
  7.    int i, j;
  8.  
  9.    if( !Partida[fil][col].visible &&
  10.        !Partida[fil][col].mine &&
  11.        !Partida[fil][col].num &&
  12.        !Partida[fil][col].flag ) {
  13.        Partida[fil][col].visible = true;
  14.  
  15.        for(i = inicio_fil; i <= fin_fil; ++i) {
  16.            for(j = inicio_col; j <= fin_col; ++j) {
  17.                if(i==0 && j==0) continue; // Para no volver a caer en la casilla actual. Aunque es redundante no gasto tantos ciclos de reloj como si hay que realizar una llamada a la función en la misma coordenada y esperar a que esta se detenga por si sola.
  18.                FncOpenPoint(Partida, fil+i, col+j);
  19.            }
  20.        }
  21.    }
  22. }


« Última modificación: 9 Enero 2018, 18:59 pm por MAFUS » En línea

dijsktra

Desconectado Desconectado

Mensajes: 110


Mr Edsger Dijsktra (Tribute to)


Ver Perfil
Re: AYUDA CON RECURSIVIDAD
« Respuesta #11 en: 7 Febrero 2018, 15:08 pm »

A ver, vamos por partes.
En vez del buscaminas, hagamos una simplificación del problema para entenderlo mejor. Después solo lo adaptas al buscaminas (numeros, visible...)

De una matriz NxM de 0's y 1's, tenemos que dar una posición donde encontrar un 1. Nos vale cualquiera.

Código:
M=4, N=5
    0     i      M
    +--+--+--+--+
  |  |  |  |  |
  +--+--+--+--+
  |1 |  |  |  |
  +--+--+--+--+
j |  |  |  | 1|
  +--+--+--+--+
  |  |  |  |  |
  +--+--+--+--+
  |  |  |  |  |
  +--+--+--+--+
          N

    Sol:  V[2][3]=1



Lo primero que te tienes que dar cuenta es de que la complejidad en el caso peor va a ser Omega(n^2) y no puedes bajar de ahí (imagina que está en la última casilla en el orden de  búsqueda).

Ahora viene la siguiente cuestión: se pide recursiva, de acuerdo, pero...
Por que no intenar dividiendo el tamaño del problema en  vez de sustrayendo?  

Me explico, se divide la matriz en cuatro cuadrantes A,B,C,D dividiendo sus dimensiones N,M por la mitad, y por recursión damos por resuelto el problema. Hay dos casos base posible:
  • matriz sin celdas, o vacía, donde nunca encuentras un 1. (significa que te has salido del rango)
  • matriz con UNA celda : si está, devolvemos cierto y las coordenadas de la celda. en otro caso falso y da igual las coordenadas

Imporante: En esta implementación siempre pensamos en el operador cortocircuitado OR... Es decir (true || a == 6 ) nunca pasa a evaluar la segunda expresi'on a==6. De otro modo, esto puede no funcionar. En la práctica, la mayoría de los compiladores proceden así, pero no se sabe si algun optimizador puede cambiar el orden.

Ahí va la solucion
Código
  1. #include <iostream>
  2.  
  3. using namespace std;
  4.  
  5. #define MAX 100
  6. /*
  7.  
  8. M=4, N=5
  9.            0     i      M
  10.            +--+--+--+--+
  11.   |  |  |  |  |
  12.   +--+--+--+--+
  13.   |1 |  |  |  |
  14.   +--+--+--+--+
  15. j |  |  |  | 1|
  16.   +--+--+--+--+
  17.   |  |  |  |  |
  18.   +--+--+--+--+
  19.   |  |  |  |  |
  20.   +--+--+--+--+
  21.           N
  22.  
  23.     Sol:  V[2][3]=1
  24. */
  25.  
  26.  
  27. /*
  28.    Global inmersion
  29.    
  30.    P : V[j0..jn)[i0..in)
  31.        0<=i0<=in<=M, 0<=j0<=jn<=N
  32.    Q : found -> V[x][y]= 1
  33.  
  34.    B1 : empty square
  35.    B2 : one-cell square
  36.    C(i0,in,j0,j0) = (in-i0)*(jn-j0) (Area)
  37.    O(n^2), since A=4,B=2, k=0 and 4 > 2
  38. */
  39. bool RR(const int V[][MAX],
  40. const int j0, const int jn, // N
  41. const int i0, const int in, // M
  42. int &x, int &y)
  43. {
  44.  
  45.  if (((in-i0)*(jn-j0)) == 0) // empty
  46.    return false;
  47.  if (((in-i0)*(jn-j0)) == 1) // 1 cell
  48.    {
  49.      x=j0;
  50.      y=i0;
  51.      return (V[x][y]==1);
  52.    }
  53.  else // 2 or more cells
  54.    {
  55.      const int hi = (in + i0) /2 ;
  56.      const int hj = (jn + j0) /2 ;
  57.      return
  58. (
  59. RR(V,j0,hj,i0,hi,x,y) || RR(V,j0,hj,hi,in,x,y) ||
  60. RR(V,hj,jn,i0,hi,x,y) || RR(V,hj,jn,hi,in,x,y)
  61. );
  62.    }
  63. }  
  64.  
  65.  
  66.  
  67. /*
  68.    P : \exists i : 0 <= i<N , 0 <=j<M : V[i][j]=1
  69.  
  70.    Q : M[x][y]=1
  71.  
  72. */
  73. void R(const int V[][MAX],
  74.      const int N, const int M,
  75.       int &x, int &y)
  76. {
  77.  RR(V,0,N,0,M,x,y);
  78.  return;
  79. }
  80.  
  81.  
  82. int main()
  83. {
  84.  int V[MAX][MAX] ;
  85.  int n,N,m,M ;
  86.  int x,y;
  87.  cin >> N;
  88.  cin >> M;
  89.  for(int n=0; n<N; n++)
  90.    for(int m=0; m<M; m++) cin >> V[n][m];
  91.  R(V,N,M,x,y);
  92.  cout << "(" << x << "," << y << ")" << endl;
  93.  return 0;
  94. }
  95.  

Algunos casos de prueba
Código:
6 5

0 0 1 0 0
0 0 0 0 0
0 0 0 0 0
0 0 0 0 1
0 0 0 0 0
0 0 0 0 0

Resultado
Código:
(0,2)


Otro

Código:
12 5

0 0 0 0 0
0 0 0 0 0
0 0 0 0 0
0 0 0 0 0
0 0 0 0 0
0 0 0 0 0
0 0 0 0 0
0 0 0 0 0
0 0 0 0 1
0 0 0 0 0
0 0 0 0 0
0 0 0 0 0

Código:
(8,4)


« Última modificación: 7 Febrero 2018, 15:58 pm por dijsktra » En línea

Si la depuración es el proceso de eliminar fallos en el software, entonces programar debe ser el proceso de ponerlos dentro. (Edsger Dijsktra)
Páginas: 1 [2] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
ayuda con recursividad
.NET (C#, VB.NET, ASP)
eagle17 2 3,449 Último mensaje 1 Marzo 2009, 10:29 am
por bitarray
ayuda recursividad
.NET (C#, VB.NET, ASP)
Choclito 2 2,884 Último mensaje 14 Mayo 2009, 03:38 am
por Choclito
Ayuda con Recursividad
.NET (C#, VB.NET, ASP)
40 3 2,621 Último mensaje 14 Septiembre 2015, 18:19 pm
por DarK_FirefoX
Ayuda recursividad « 1 2 »
Programación C/C++
JUHC 10 10,298 Último mensaje 8 Agosto 2016, 16:41 pm
por AlbertoBSD
Ayuda con recursividad
Programación C/C++
Beginner Web 9 3,111 Último mensaje 16 Septiembre 2018, 16:35 pm
por Beginner Web
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines