¿Alguien me podría ayudar con este código?
Necesito que se genere solo una entrada y una salida.
En el código actual se genera más de un camino a la vez y necesito que sea solo uno conectado con la entrada y salida. :-\
Agrego: Estoy compilando en Borland C++
#include <stdio.h>
#include <conio.h>
#include <iostream.h>
#include <stdlib.h>
#include <time.h>
int lab[11][11];
int iniciocol=0, iniciofila=0, fincol=0, finfila=0, caminfila=0, camincol=0, decidir=0, pared=1, espacio=0;
main(){
/*se asignan paredes*/
for(int i=0; i<12; i++){
for(int j=0; j<12;j++){
lab[i][j] = pared;
}
}
/*se genera el inicio*/
srand(time(NULL));
iniciocol = (1+rand()%(11-1));
if (iniciocol == 0) {
iniciofila = (1+rand()%(11-1));
} else {
iniciofila = 0;
}
/*Asignamos la entrada y salida y declaramos para empezar a crear el camino*/
lab[iniciofila][iniciocol] = espacio;
caminfila = iniciofila++;
camincol = iniciocol;
lab[caminfila][camincol] = espacio;
/*Creamos el camino*/
while(caminfila < 11 && camincol < 11){
decidir = rand()%4;
if (decidir == 0){ /*camino se fabrica a la izquierda*/
camincol = camincol-1;
lab[caminfila][camincol] = espacio;
} else if(decidir ==1 ) { /*camino para abajo*/
caminfila++;
lab[caminfila][camincol] = espacio; /*camino a la derecha*/
} else if (decidir == 2){
camincol++;
lab[caminfila][camincol];
}
}
/*muestra el laberinto*/
for(int i=0; i<12; i++){
for(int j=0; j<12;j++){
if(lab[i][j] == pared){
cout<<"#";
cout<<" ";
} else {
cout<<".";
cout<<" ";
}
}
cout<<"\n";
}
getchar();
}
No entiendo lo que haces.
A mi compilando tu codigo me da esto:
Citar# # # # # # # # # # # #
# # # # # # # # # # # #
# # # # # # # # # # # #
# # # # # # # # # # # #
# # # # # # # # # # # #
# # # # # # # # # # # #
# # # # # # # # # # # #
# # # # # # # # # # # #
# # # # # # # # # # # #
# # # # # # # # # # # #
# # # # # # # # # # # .
. # # # . . . # # # # #
Cual es el resultado esperado? No veo ningun camino en el laberinto
Vale, muchas cosas:
No compruebas que estás en los bordes del laberinto, que significa que habrías salido. Solo haces una comprobación en el while(caminfila < 11 && camincol < 11) de que no estás fuera de las dimensiones de la tabla.
Las operaciones de inicio del camino están un poco mal. Tu dices:
iniciocol = (1+rand()%(11-1));
if (iniciocol == 0) {
iniciofila = (1+rand()%(11-1));
} else {
iniciofila = 0;
}
inicioco nunca valdrá 0 puesto que ese 1+... ya hace que el valor sea al menos 1, con lo que nunca se entrará en el else.
De igual forma 1+rand()%(11-1) puede darse el caso de que valga 11 con lo que estarías en la esquina del laberinto, y al poder moverte solamente Sur, Este, Oeste, cualquier movimiento que hicieras te dejaría a la salida del laberinto.
Realmente te sobran variables:
iniciocol, iniciofila, fincol, finfila están de más. Puedes empezar solo con camincol y caminfila e ir actualizándolas.
En 'Creamos el camino' la operación decidir = rand%4 está mal porqué después en la elección de opciones solo tienes en cuenta los números del 0 al 2, entonces debería ser decidir = rand%3
De igual forma ahí la estructura if - else la puedes sustituir por un switch y aclararás el código, además de usar la estructura correcta para el propósito que buscas.
En 'se asignan paredes' y 'muestra el laberinto' te sales de los límites de la tabla. Deberías moverte desde 0 hasta 10 y te mueves de 0 hasta 11, tanto en horizontal como en vertical.
Bueno, gracias por la ayuda, hice varias modificaciones y ahora ya consigo que me genere un camino, pero ahora que lo ejecuto no me muestra automáticamente la solución.
#include <stdio.h>
#include <conio.h>
#include <iostream.h>
#include <stdlib.h>
#include <time.h>
int lab[12][12];
int iniciocol=0, iniciofila=0, caminfila=0, camincol=1, decidir=0, pared=1, espacio=0, yapaso=2, novolver=3;
main(){
/*se asignan paredes*/
for(int i=0; i<12; i++){
for(int j=0; j<12;j++){
lab[i][j] = pared;
}
}
/*se genera el inicio*/
srand(time(NULL));
iniciofila = (1+rand()%(6-1));
/*Asignamos la entrada y declaramos el pasillo de entrada*/
lab[iniciofila][iniciocol] = espacio;
caminfila = iniciofila;
lab[caminfila][camincol] = espacio;
/*Creamos el camino*/
while(caminfila < 11 && camincol < 11){
decidir = rand()%3;
if (decidir == 0){ /*camino se fabrica a la izquierda*/
camincol = camincol-1;
if(camincol < 1){
camincol = camincol+1;
} else {
lab[caminfila][camincol] = espacio;
camincol++;
}
}
if(decidir ==1 ) { /*camino para abajo*/
caminfila++;
lab[caminfila][camincol] = espacio;
} else if (decidir == 2){ /*camino a la derecha*/
camincol++;
lab[caminfila][camincol] = espacio;
}
}
/*Se crean caminos falsos*/
for(int i=1; i<11; i++){
for(int j=1;j<11;j++){
if (lab[i][j] != espacio) {
decidir = rand()%2;
if(decidir==0){
lab[i][j] = espacio;
}
}
}
}
/*Se resuelve el laberinto*/
lab[iniciofila][iniciocol] = yapaso;
caminfila = iniciofila;
camincol = iniciocol;
while(caminfila<12){
if(lab[caminfila+1][camincol] == espacio){
caminfila++;
lab[caminfila][camincol] = yapaso;
} else if(lab[caminfila][camincol+1] == espacio){
camincol++;
lab[caminfila][camincol] = yapaso;
} else if(lab[caminfila-1][camincol] == espacio){
caminfila--;
lab[caminfila][camincol] = yapaso;
} else if(lab[caminfila][camincol-1] == espacio){
camincol--;
lab[caminfila][camincol] = yapaso;
} else if((lab[caminfila+1][camincol] != espacio) && (lab[caminfila][camincol+1] != espacio) && (lab[caminfila-1][camincol] != espacio)){
lab[caminfila][camincol] = novolver;
camincol--;
} else if((lab[caminfila+1][camincol] != espacio) && (lab[caminfila][camincol+1] != espacio) && (lab[caminfila][camincol-1] != espacio)){
lab[caminfila][camincol] = novolver;
caminfila--;
} else if((lab[caminfila+1][camincol] != espacio) && (lab[caminfila][camincol+1] != espacio) && (lab[caminfila-1][camincol] != espacio)){
lab[caminfila][camincol] = novolver;
camincol++;
} else if((lab[caminfila-1][camincol] != espacio) && (lab[caminfila][camincol+1] != espacio) && (lab[caminfila-1][camincol] != espacio)){
lab[caminfila][camincol] = novolver;
caminfila++;
}
}
/*muestra el laberinto*/
for(int i=0; i<12; i++){
for(int j=0; j<12;j++){
if(lab[i][j] == pared){
cout<<"#";
cout<<" ";
} else if((lab[i][j] == espacio) || lab(lab[i][j] == novolver)) {
cout<<".";
cout<<" ";
} else if (lab[i][j] == yapaso){
cout<<"X";
cout<<" ";
}
}
cout<<"\n";
}
getchar();
}
El la linea 102 tienes:
} else if((lab[i][j] == espacio) || lab(lab[i][j] == novolver)) {
Deberia ser:
} else if((lab[i][j] == espacio) || (lab[i][j] == novolver)) {
No?