#include <stdio.h>
#include <stdlib.h>
#include <time.h>

#define UP    0
#define DOWN  1
#define RIGHT 2
#define LEFT  3

#define WALL    1
#define PASSAGE 0

/* 迷路版の初期化． */
void initialize(int *map, int width, int height){
  int i, j;

  /* 壁を作成する．壁以外は全て空白にする */
  for(i = 0; i < height; i++){
    for(j = 0; j < width; j++){
      if(i == 0 || j == 0 || i == height - 1 || j == width - 1){
        map[i * width + j] = WALL;
      }
      else{
        map[i * width + j] = PASSAGE;
      }
    }
  }

  /* 内壁を配置する */
  for(i = 2; i < height - 2; i += 2){
    for(j = 2; j < width - 2; j += 2){
      map[i * width + j] = WALL;
    }
  }
  
  map[width] = PASSAGE; /* スタート地点 */
  map[width * (height - 1) - 1] = PASSAGE; /* ゴール */
}

/* 迷路を出力する． */
void print_maze(int *map, int width, int height){
  int i, j;

  for(i = 0; i < height; i++){
    for(j = 0; j < width; j++){
      if(map[i * width + j] == WALL) putchar('X');
      else                           putchar(' ');
    }
    putchar('\n');
  }
}

/* 迷路を作成する． */
void build_maze(int *map, int width, int height){
  int i, j;
  int direction;
  int point;

  for(i = 2; i < height - 2; i += 2){
    for(j = 2; j < width - 2; j += 2){
      for(;;){ /* 必ずある方向に壁を作る */
        if(j == 2){
          /* 左端の内壁の場合は全ての方向に壁を作成できる */
          direction = rand() % 4;
        }
        else{
          /* 左端以外の内壁の場合は左方向に壁を作成できない． */
          direction = rand() % 3;
        }

        switch(direction){
        case UP:    /* 1 */
          point = (i - 1) * width + j;
          break;
        case DOWN:  /* 2 */
          point = (i + 1) * width + j;
          break;
        case RIGHT: /* 3 */
          point = i * width + j + 1;
          break;
        case LEFT:  /* 4 */
          point = i * width + j - 1;
          break;
        }
        if(map[point] == PASSAGE){
          map[point] = WALL;
          break; /* 壁を作成すると for ループを抜ける */
        }
      }
    }
  }
  
}

int main(int argc, char *argv[]){
  int width, height;
  int *map;
  
  srand(time(0));
  if(argc == 3){
    width = atoi(argv[1]);
    height = atoi(argv[2]);
    /* 偶数ならば 1 マス余計な箇所ができるので奇数にする */
    if(width % 2 == 0)  width += 1;
    if(height % 2 == 0) height += 1;
  }
  else{
    width = 81;
    height = 25;
  }

  /* 迷路版の領域確保 */
  map = (int *)malloc(sizeof(int) * (width * height));

  initialize(map, width, height);

  build_maze(map, width, height);

  print_maze(map, width, height);
}
