|
Esta sección te permite ver todos los posts escritos por este usuario. Ten en cuenta que sólo puedes ver los posts escritos en zonas a las que tienes acceso en este momento.
Mensajes - rafaeljosem
Páginas: [1]
1
« en: Jueves 24 de Agosto de 2006, 22:48 »
Hola, tengo el siguiente ejercicio: Aplicar el esquema de los algoritmos divide y venceras para que dadas las coordenadas (x, y) de dos puntos en el plano, que representen los extremos en un segmento, se dibuje el segmento. Esto es lo que tengo, en codigo C: void ptomedio(double xmedio, double ymedio, double x1, double x2, double y1, double y2) { int index; if (((xmedio > x1) && (ymedio > y1))||((xmedio > x2) && (ymedio > y2))) { x2 = xmedio; y2 = ymedio; contador++; //cuenta el nro de veces que se llama una funcion ptomedio ((x1+x2)/2.0, (y1+y2)/2.0, x1, x2, y1, y2); //haz lo mismo para la primera mitad x1 = xmedio; y1 = ymedio; ptomedio ((x2 + xmedio)/2, (y2+ymedio)/2, x1, x2, y1, y2); //lo mismo para la 2da mitad for (index = contador; index > 0; index--) printf(" "); printf("."); printf("\n"); contador--; } }
El algoritmo me funciona solo cuando el segmento tiene pendiente positiva. Necesito ayuda para hacerlo que funcione para pendiente negativa tambien. Hice la llamada a la funcion de la sigte forma: ptomedio((2.0+1.0)/2.0,(5.0+4.0)/2.0, 1.0, 2.0, 3.0, 4.0);
Gracias
2
« en: Domingo 20 de Agosto de 2006, 20:39 »
Ya pude resolver el problema. El codigo que habia puesto no tenia ningun error, el problema estaba en que al hacer N = 8, el programa buscaba la solucion dentro de un numero muy grande de combinaciones, por lo que demoraba demasiado tiempo. Me di cuenta al copiar otro codigo que encontre en internet, y me hacia lo mismo, asi que hice N = 5 y funciono
3
« en: Domingo 20 de Agosto de 2006, 17:53 »
Hola, el codigo que escribi lo saque de un libro, en donde se esta tratando el tema de Backtracking, el problema es que la explicacion del libro no es muy buena (y al parecer el codigo que ellos presentan para este problema tiene errores), si podrias reconmendarme algun link en donde pueda encontrar informacion sobre backtracking, te lo agradecería.
Gracias
4
« en: Domingo 20 de Agosto de 2006, 04:16 »
Hola Necesito ayuda con el siguiente codigo, el problema es que la funcion saltocaballo() se llama a si misma infinitamente, no se que hacer. Este programa tiene como objetivo buscar la secuencia de saltos ha de dar un caballo de ajedrez, partiendo de una casilla cualquiera, para pasar por cada una de las casillas del tablero #define N 8 #define n (N+1) void saltocaballo(int i, int x, int y, int *exito); void escribetablero(); int tablero[n][n]; int d[8][2] = {{2,1}, {1,2}, {-1,2}, {-2,1},{-2,-1}, {-1,-2}, {1,-2}, {2,-1}}; // los 8 posibles movimientos del caballo se obtienen sumando //estos valores con la posicion actual (x,y) int main(void) { int x, y; int solucion, i, j; do{ printf("\nCoordenadas iniciales del caballo "); scanf ("%d %d", &x, &y); } while ((x<1) || (x > N) || (y < 1) || (y > N)); //valores iniciales del tablero for (i = 1; i <=N; i++) for (j = 1; j<=N; j++) tablero[i][j] = 0; tablero[x][y] = 1; //llamada con coordenadas iniciales y primer salto solucion = 0; saltocaballo (2,x,y,&solucion); if (solucion) { puts("\n\tEl Problema tiene solucion:\n"); escribetablero(); } else puts("No se ha encontrado solución al problema\n"); putchar('\n'); system("PAUSE"); return 0; } void saltocaballo(int i, int x, int y, int *exito) { int nx, ny; int k; *exito = 0; k = 0; //inicializa el conjunto de posible movimientos do { k++; nx = (x + d[(k-1)][0]); ny = (y + d[(k-1)][1]); //determina si nuevas coordenadas son aceptables if ((nx >= 1) &&(nx <= N) && (ny >= 1) && (ny <= N) && (tablero[nx][ny] == 0)) { tablero[nx][ny] = i; //anota movimiento if (i < (N*N)) { saltocaballo((i+1), nx, ny, exito); if (!(*exito)) //no se alcanzo solucion { tablero[nx][ny] = 0; //se borra anotación } } else *exito = 1; //caballo ha cunierto el tablero } }while ((k < 8) && !(*exito)); }
Páginas: [1]
|
|
|