#include <stdlib.h>
#include <stdio.h>
#include <time.h>
enum {
W = 36, // width of maze
H = 25 // height of maze
};
enum {
North,
East,
South,
West,
NDir
};
char visited[H][W];
char horz[H][W - 1]; // horizontal E-W paths in the maze
char vert[H - 1][W]; // veritcal N-S paths in the maze
/*
* Fill dir with directions to unvisited cells, return count
*/
int adjacent(int dir[], int x, int y)
{
int ndir = 0;
if (y > 0 && visited[y - 1][x] == 0) dir[ndir++] = North;
if (x < W - 1 && visited[y][x + 1] == 0) dir[ndir++] = East;
if (y < H - 1 && visited[y + 1][x] == 0) dir[ndir++] = South;
if (x > 0 && visited[y][x - 1] == 0) dir[ndir++] = West;
return ndir;
}
/*
* Traverse cells depth first and create paths as you go
*/
void dfs(int x, int y)
{
int dir[NDir];
int ndir;
visited[y][x] = 1;
ndir = adjacent(dir, x, y);
while (ndir) {
int pick
= rand() % ndir
;
switch (dir[pick]) {
case North: vert[y - 1][x] = 1; dfs(x, y - 1); break;
case East: horz[y][x] = 1; dfs(x + 1, y); break;
case South: vert[y][x] = 1; dfs(x, y + 1); break;
case West: horz[y][x - 1] = 1; dfs(x - 1, y); break;
}
ndir = adjacent(dir, x, y);
}
}
/*
* Print a map of the maze
*/
void map(void)
{
int i, j;
for (i = 0; i < W; i++) {
}
for (j = 0; j < H; j++) {
for (i = 0; i < W; i++) {
putchar(j
< H
- 1 && vert
[j
][i
] ? ' ' : '_'); putchar(i
< W
- 1 && horz
[j
][i
] ? '_' : '|'); }
}
}
int main()
{
dfs(0, 0);
map();
return 0;
}
CiNpbmNsdWRlIDxzdGRsaWIuaD4KI2luY2x1ZGUgPHN0ZGlvLmg+CiNpbmNsdWRlIDx0aW1lLmg+CgplbnVtIHsKICAgIFcgPSAzNiwgICAgICAgICAvLyB3aWR0aCBvZiBtYXplCiAgICBIID0gMjUgICAgICAgICAgLy8gaGVpZ2h0IG9mIG1hemUKfTsKCmVudW0gewogICAgTm9ydGgsCiAgICBFYXN0LAogICAgU291dGgsCiAgICBXZXN0LAogICAgTkRpcgp9OwoKY2hhciB2aXNpdGVkW0hdW1ddOwpjaGFyIGhvcnpbSF1bVyAtIDFdOyAgICAgICAgLy8gaG9yaXpvbnRhbCBFLVcgcGF0aHMgaW4gdGhlIG1hemUKY2hhciB2ZXJ0W0ggLSAxXVtXXTsgICAgICAgIC8vIHZlcml0Y2FsIE4tUyBwYXRocyBpbiB0aGUgbWF6ZQoKLyoKICogICAgICBGaWxsIGRpciB3aXRoIGRpcmVjdGlvbnMgdG8gdW52aXNpdGVkIGNlbGxzLCByZXR1cm4gY291bnQKICovCmludCBhZGphY2VudChpbnQgZGlyW10sIGludCB4LCBpbnQgeSkKewogICAgaW50IG5kaXIgPSAwOwoKICAgIGlmICh5ID4gMCAgICAgJiYgdmlzaXRlZFt5IC0gMV1beF0gPT0gMCkgZGlyW25kaXIrK10gPSBOb3J0aDsKICAgIGlmICh4IDwgVyAtIDEgJiYgdmlzaXRlZFt5XVt4ICsgMV0gPT0gMCkgZGlyW25kaXIrK10gPSBFYXN0OwogICAgaWYgKHkgPCBIIC0gMSAmJiB2aXNpdGVkW3kgKyAxXVt4XSA9PSAwKSBkaXJbbmRpcisrXSA9IFNvdXRoOwogICAgaWYgKHggPiAwICAgICAmJiB2aXNpdGVkW3ldW3ggLSAxXSA9PSAwKSBkaXJbbmRpcisrXSA9IFdlc3Q7CiAgICAKICAgIHJldHVybiBuZGlyOwp9CgovKgogKiAgICAgIFRyYXZlcnNlIGNlbGxzIGRlcHRoIGZpcnN0IGFuZCBjcmVhdGUgcGF0aHMgYXMgeW91IGdvCiAqLwp2b2lkIGRmcyhpbnQgeCwgaW50IHkpCnsKICAgIGludCBkaXJbTkRpcl07CiAgICBpbnQgbmRpcjsKICAgIAogICAgdmlzaXRlZFt5XVt4XSA9IDE7CiAgICAKICAgIG5kaXIgPSBhZGphY2VudChkaXIsIHgsIHkpOwogICAgCiAgICB3aGlsZSAobmRpcikgewogICAgICAgIGludCBwaWNrID0gcmFuZCgpICUgbmRpcjsKICAgICAgICAKICAgICAgICBzd2l0Y2ggKGRpcltwaWNrXSkgewogICAgICAgIGNhc2UgTm9ydGg6IHZlcnRbeSAtIDFdW3hdID0gMTsgZGZzKHgsIHkgLSAxKTsgYnJlYWs7CiAgICAgICAgY2FzZSBFYXN0OiAgaG9yelt5XVt4XSA9IDE7ICAgICBkZnMoeCArIDEsIHkpOyBicmVhazsKICAgICAgICBjYXNlIFNvdXRoOiB2ZXJ0W3ldW3hdID0gMTsgICAgIGRmcyh4LCB5ICsgMSk7IGJyZWFrOwogICAgICAgIGNhc2UgV2VzdDogIGhvcnpbeV1beCAtIDFdID0gMTsgZGZzKHggLSAxLCB5KTsgYnJlYWs7CiAgICAgICAgfQogICAgCiAgICAgICAgbmRpciA9IGFkamFjZW50KGRpciwgeCwgeSk7CiAgICB9Cn0KCi8qCiAqICAgICAgUHJpbnQgYSBtYXAgb2YgdGhlIG1hemUKICovCnZvaWQgbWFwKHZvaWQpCnsKICAgIGludCBpLCBqOwogICAgCiAgICBmb3IgKGkgPSAwOyBpIDwgVzsgaSsrKSB7CiAgICAgICAgcHV0Y2hhcignXycpOwogICAgICAgIHB1dGNoYXIoJ18nKTsKICAgIH0KICAgIAogICAgcHV0Y2hhcignXG4nKTsKCiAgICBmb3IgKGogPSAwOyBqIDwgSDsgaisrKSB7CiAgICAgICAgcHV0Y2hhcignfCcpOwogICAgICAgIAogICAgICAgIGZvciAoaSA9IDA7IGkgPCBXOyBpKyspIHsKICAgICAgICAgICAgcHV0Y2hhcihqIDwgSCAtIDEgJiYgdmVydFtqXVtpXSA/ICcgJyA6ICdfJyk7CiAgICAgICAgICAgIHB1dGNoYXIoaSA8IFcgLSAxICYmIGhvcnpbal1baV0gPyAnXycgOiAnfCcpOwogICAgICAgIH0KICAgIAogICAgICAgIHB1dGNoYXIoJ1xuJyk7CiAgICB9Cn0KCmludCBtYWluKCkKewogICAgc3JhbmQodGltZShOVUxMKSk7CgogICAgZGZzKDAsIDApOwogICAgbWFwKCk7CgogICAgcmV0dXJuIDA7Cn0K