#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define WIDTH 100
#define HEIGHT 50

void print(char* arr)
{
   int i;
   int j;
   for(i = 0; i < HEIGHT; i++)
   {
      for(j = 0; j < WIDTH; j++)
      {
         printf("%c",arr[i*WIDTH + j]);
      }
      printf("\n");;
   }
}


void tree(int branchpos, int branchlen, int x, int y, char branchtyp, char* arr)
{
   int r;
   int i;
   int dx;
   int dy;
   char ln;
   char rn;

   int lxo;
   int lyo;
   int mxo;
   int myo;
   int rxo;
   int ryo;


   char o[] = {'l','m','r'};
   char ot;


   if(arr[y*WIDTH + x] == ' ')
   {
      if(branchtyp == '|')
      {
         dx = 0;
         dy = -1;
         ln = '\\';
         rn = '/';
         lxo = -1;
         lyo = 0;
         mxo = 0;
         myo = 0;
         rxo = 1;
         ryo = 0;
      }
      else if(branchtyp == '\\')
      {
         dx = -1;
         dy = -1;
         ln = '_';
         rn = '|';
         lxo = -2;
         lyo = 0;
         mxo = -1;
         myo = 0;
         rxo = 0;
         ryo = 0;
      }
      else if(branchtyp == '/')
      {
         dx = 1;
         dy = -1;
         ln = '|';
         rn = '-';
         lxo = 0;
         lyo = 0;
         mxo = 1;
         myo = 0;
         rxo = 2;
         ryo = 0;
      }
      else if(branchtyp == '_')
      {
         dx = -1;
         dy = 0;
         ln = '/';
         rn = '\\';
         lxo = 0;
         lyo = 1;
         mxo = -1;
         myo = 0;
         rxo = 0;
         ryo = 0;
      }
      else if(branchtyp == '-')
      {
         dx = 1;
         dy = 0;
         ln = '/';
         rn = '\\';
         lxo = 0;
         lyo = 0;
         mxo = 1;
         myo = 0;
         rxo = 0;
         ryo = 1;
      }

      if(branchpos < branchlen)
      {
         arr[y*WIDTH + x] = branchtyp;
         tree(branchpos + 1, branchlen, x+dx, y+dy, branchtyp, arr);
      }
      else if(branchlen > 0)
      {
         for(i = 3; i > 1; i--)
         {
            r = rand() % 3;
            ot = o[i];
            o[i] = o[r];
            o[r] = ot;
         }

         for(i = 0; i < 3; i++)
         {
            if(o[i] == 'l')
            {
               tree(0, branchlen - 2+ (rand()%3 - 1), x + lxo, y + lyo, ln, arr);
            }
            else if(o[i] == 'm' )
            {
               tree(0, branchlen - 1 + (rand()%3 - 1), x + mxo, y + myo, branchtyp, arr);
            }
            else if(o[i] == 'r')
            {
               tree(0, branchlen - 2+ (rand()%3 - 1), x + rxo, y + ryo, rn, arr);
            }
         }
      }
      else
      {
         arr[y*WIDTH + x] = branchtyp;
      }
   }
}


int main(int argc, char* argv[])
{
   char arr[WIDTH*HEIGHT];
   char*ptr;
   int i;
   if(argc == 1)
   {
     srand(time(NULL));
   }
   else
   {
      srand((unsigned int)strtol(argv[1],&ptr,10));
   }
   for(i = 0; i < WIDTH*HEIGHT; i++)
   {
      arr[i] = ' ';
   }
   tree(0, 7, WIDTH/2, HEIGHT - 1, '|', arr);
   print(arr);
   return (0);
}