Código de C/Visual C - Simulación y resolución en un Laberinto

Simulación y resolución en un Laberintográfica de visualizaciones


C/Visual C

estrellaestrellaestrellaestrellaestrella(1)
Publicado el 22 de Octubre del 2002 por Oliver Mar Ramirez
12.479 visualizaciones desde el 22 de Octubre del 2002. Una media de 21 por semana
Código que genera un laberinto alegatorio y que seguidamente lo resuelve. Los caracteres "|" significan espacios reservados para laberinto, los caracteres "*" son la ruta que sigue el algoritmo para localizar la salida. Realizado en Borland C

Versión 1
estrellaestrellaestrellaestrellaestrella(1)

Publicado el 22 de Octubre del 2002gráfica de visualizaciones de la versión: Versión 1
12.480 visualizaciones desde el 22 de Octubre del 2002. Una media de 21 por semana
estrellaestrellaestrellaestrellaestrella
estrellaestrellaestrellaestrella
estrellaestrellaestrella
estrellaestrella
estrella

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
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
#include <stdio.h>
#include <time.h>
#include <stdlib.h>
#include <conio.h>
#define rando( min, max ) ((rand() % (int)(((max)+1) - (min))) + (min))
int w=0, z=0, i=0, j=0, limit=100;
void pon(int lab[][10])
{
	clrscr();
	for(int t=0; t<10;t++){
		for(int r=0; r<10;r++)
		printf("%c",lab[t][r]>0? lab[t][r]>1? lab[t][r]>2? '@': '*': '_' :'|');
		printf("\n");
	}
}
int esta(int lab [][10],int &x, int &y){
	int repa=0;
	if(lab[x][y+1]==1){ i=x; j=++y; repa=1;}
	if(lab[x+1][y]==1){ i=++x; j=y; repa=1;}
	if(lab[x][y-1]==1){ i=x; j=--y; repa=1;}
	if(lab[x-1][y]==1){ i=--x; j=y; repa=1;}
	return repa;
}
void rebusca(int lab[][10])
{
	int x=0, y=0, tri=0, poas=0;
	for(;;){
	if(lab[x][y+1]>=2 && tri!=3){ ++y; tri=1; if(esta(lab, x, y)) break; else poas++; }
	if(lab[x+1][y]>=2 && tri!=4){ ++x; tri=2; if(esta(lab, x, y)) break; else poas++; }
	if(lab[x][y-1]>=2 && tri!=1){ --y; tri=3; if(esta(lab, x, y)) break; else poas++; }
	if(lab[x-1][y]>=2 && tri!=2){ --x; tri=4; if(esta(lab, x, y)) break; else poas++; }
	if(poas>=5){ poas=0; limit+=30;}
	}
}
void fill(int lab[][10])
{
	int x=1,cox, tesk=0;
	for(i=0;i<10;i++) for(j=0;j<10;j++) lab[i][j]=0;
	lab[0][0]=1;
	for(i=0,j=0;;) {
	switch(rando(4,13)){
	case 5:
	if(j+x<10 && tesk!=3 ){
	for(cox=j+x;j<=cox;j++) lab[i][j]=1;
	pon(lab); tesk=1;
	} break; //der
	case 7:
	if(i+x<10 && tesk!=4 ){
	for(cox=i+x;i<=cox;i++) lab[i][j]=1;
	pon(lab); tesk=2;
	} break; //abajo
	case 9:
	if(j-x>0 && tesk!=1 && lab[i][j-1]==0){
	for(cox=j-x;j>=cox;j--) lab[i][j]=1;
	pon(lab); tesk=3;
	} break; //izq
	case 11:
	if(i-x>0 && tesk!=2 && lab[i-1][j]==0){
	for(cox=i-x;i>=cox;i--) lab[i][j]=1;
	pon(lab); tesk=4;
	} break; //arriba
	}
	if(i>=9 || j>=9){ w=i; z=j; if(i>9) w=9; if(j>9) z=9; i=j=0; break;}
	}
	pon(lab);
}
void res(int lab[][10])
{
	static x=0, cast=0;;
	if(j+1<10 && x!=2){ // derecha 
	if(lab[i][j+1]>=1){ lab[i][j]=2; lab[i][++j]=3;
	pon(lab); x=1; cast+=2; }
	}
	if(i+1<10 && x!=4){ //abajo
	if(lab[i+1][j]>=1){ lab[i][j]=2; lab[++i][j]=3;
	pon(lab); x=3; cast+=2;}
	}
	if(j-1>=0 && x!=1){ //izquierda
	if(lab[i][j-1]>=1){ lab[i][j]=2; lab[i][--j]=3;
	pon(lab); x=2; cast+=2; }
	}
	if(i-1>=0 && x!=3){ //arriba
	if(lab[i-1][j]>=1){ lab[i][j]=2; lab[--i][j]=3 ;
	pon(lab); x=4; cast+=2; }
	}
	if(cast>limit){ cast=0; rebusca(lab); }
	if(i==w && j==z){ getch(); exit(0);}
	res(lab);
}
void main()
{
	int lab[10][10];
	srand((unsigned)time(NULL));
	clrscr();
	printf("Este programa podria no funcionar, es necesesario ejecutarlo varias veces\n");
	printf("el margen de error es de 3 por cada 20 ejecuciones\n"); getch();
	fill(lab);
	res(lab);
	getch();
}



Comentarios sobre la versión: Versión 1 (1)

ALi
23 de Octubre del 2002
estrellaestrellaestrellaestrellaestrella
oye esta perfecto pero le ago para que no aga un ciclo sin finar y apararesca solo una vez el laberinto
Responder

Comentar la versión: Versión 1

Nombre
Correo (no se visualiza en la web)
Valoración
Comentarios

http://lwp-l.com/s339