Labyrinth/src/depthFirst.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;
}
}