#include <stdio.h>
#include <stdlib.h>
#define SizeX 20
#define SizeY 20
#define myrnd(f,t) rand()%((t)-(f)+1)+(f)
typedef struct {
int x, y;
} point;
int map[SizeX][SizeY],i,j;
//prototype
void pp();
void Devide(int, int, int, int);
void
pp()
{
for ( i = 0; i < SizeX; ++i) {
for ( j = 0; j < SizeY; ++j)
putchar(map[i][j] ? '#' : ' ');
puts("");
}
}
void
Devide(int x1, int y1, int x2, int y2)
{
//no devide if area is small
if ((x2 - x1 < 4) || (y2 - y1 < 4))
return;
//make new center
int xc = myrnd(x1 + 2, x2 - 2);
int yc = myrnd(y1 + 2, y2 - 2);
printf("\nDevide point = %d %d\n", xc,yc);
//make wall
for ( i = x1 + 1 + (map[x1][yc] == 0); i < x2 - (map[x2][yc] == 0); ++i)
map[i][yc] = 1;
for ( i = y1 + 1 + (map[xc][y1] == 0); i < y2 - (map[xc][y2] == 0); ++i)
map[xc][i] = 1;
//make hole
{
int i = myrnd(1, 4);
if (i != 1)
map[myrnd(x1 + 1, xc - 1)][yc] = 0;
if (i != 2)
map[myrnd(xc + 1, x2 - 1)][yc] = 0;
if (i != 3)
map[xc][myrnd(y1 + 1, yc - 1)] = 0;
if (i != 4)
map[xc][myrnd(yc + 1, y2 - 1)] = 0;
}
pp();
//new devide
Devide(x1, y1, xc, yc);
Devide(xc, y1, x2, yc);
Devide(x1, yc, xc, y2);
Devide(xc, yc, x2, y2);
}
int
main()
{
int i,j;
//map initialize
for ( i = 0; i < SizeX; ++i)
for ( j = 0; j < SizeY; ++j)
map[i][j] = (!i) ||
(i == SizeX - 1) ||
(!j) ||
(j == SizeY - 1);
Devide(0, 0, SizeX - 1, SizeY - 1);
return 0;
}