77 lines
2.1 KiB
C
77 lines
2.1 KiB
C
#include <stdio.h>
|
|
#include <stdlib.h>
|
|
#include <stdbool.h>
|
|
#include "../include/depthFirst.h"
|
|
|
|
void depthFirst_r(int i, int j, Labyrinth* labyrinth, bool show);
|
|
|
|
// dfs search algorithm
|
|
Labyrinth* depthFirst(int n, int m){
|
|
Labyrinth* labyrinth = newLabyrinth(n, m);
|
|
|
|
depthFirst_r(rand()%n, rand()%m, labyrinth, false);
|
|
|
|
resetLabyrinth(labyrinth);
|
|
|
|
return labyrinth;
|
|
}
|
|
|
|
Labyrinth* depthFirstShow(int n, int m){
|
|
Labyrinth* labyrinth = newLabyrinth(n, m);
|
|
|
|
depthFirst_r(rand()%n, rand()%m, labyrinth, true);
|
|
|
|
resetLabyrinth(labyrinth);
|
|
|
|
return labyrinth;
|
|
}
|
|
|
|
// ricursive function used by depthFirst
|
|
void depthFirst_r(int i, int j, Labyrinth* labyrinth, bool show){
|
|
labyrinth->at[i][j].visited = 1;
|
|
labyrinth->at[i][j].dp = -1;
|
|
|
|
if(show){
|
|
labyrinth->at[i][j].color = ORANGE;
|
|
printLab(labyrinth);
|
|
labyrinth->at[i][j].color = WHITE;
|
|
}
|
|
|
|
int arr[4] = {0, 1, 2, 3}, tmp, tp;
|
|
for(int h=3; h>0; h--){
|
|
tmp = rand()%h;
|
|
tp = arr[h];
|
|
arr[h] = arr[tmp];
|
|
arr[tmp] = tp;
|
|
}
|
|
|
|
for(int h=0; h<4; h++){
|
|
if(arr[h]==0){
|
|
if(i>0 && !labyrinth->at[i-1][j].visited){
|
|
labyrinth->at[i-1][j].south = 1;
|
|
depthFirst_r(i-1, j, labyrinth, show);
|
|
}
|
|
}else if(arr[h]==1){
|
|
if(j<labyrinth->y_size-1 && !labyrinth->at[i][j+1].visited){
|
|
labyrinth->at[i][j].east = 1;
|
|
depthFirst_r(i, j+1, labyrinth, show);
|
|
}
|
|
}else if(arr[h]==2){
|
|
if(i<labyrinth->x_size-1 && !labyrinth->at[i+1][j].visited){
|
|
labyrinth->at[i][j].south = 1;
|
|
depthFirst_r(i+1, j, labyrinth, show);
|
|
}
|
|
}else if(arr[h]==3){
|
|
if(j>0 && !labyrinth->at[i][j-1].visited){
|
|
labyrinth->at[i][j-1].east = 1;
|
|
depthFirst_r(i, j-1, labyrinth, show);
|
|
}
|
|
}
|
|
}
|
|
|
|
if(show){
|
|
labyrinth->at[i][j].color = ORANGE;
|
|
printLab(labyrinth);
|
|
labyrinth->at[i][j].color = WHITE;
|
|
}
|
|
} |