#include <stdio.h>

int b_s, b_t, n_s, n_w, sw;

int can_place_wolf(int *s, int i)
{
  extern int b_s, b_t, n_s;

  int j, t;

  for ( j = 0; j < n_s; j++ )
    {
      if ( (i % b_s) == (s[j] % b_s) ||
           (i / b_s) == (s[j] / b_s) )
        return 0;

      if ( (i % b_s) != 0 )
        {
          for (t = i - b_s - 1; t >= 0; t -= (b_s + 1))
            {
              if (s[j] == t)
                return 0;

              if ( (t % b_s) == 0 )
                break;
            }

          for (t = i + b_s - 1; t < b_t; t += (b_s - 1))
            {
              if (s[j] == t)
                return 0;

              if ( (t % b_s) == 0 )
                break;
            }
        }

      if ( (i % b_s) != (b_s - 1) )
        {
          for (t = i - b_s + 1; t >= 0; t -= (b_s - 1))
            {
              if (s[j] == t)
                return 0;

              if ( (t % b_s) == (b_s - 1) )
                break;
            }

          for (t = i + b_s + 1; t < b_t; t += (b_s + 1))
            {
              if (s[j] == t)
                return 0;

              if ( (t % b_s) == (b_s - 1) )
                break;
            }
        }
    }

  return 1;
}

void print_grid(int *s, int *w)
{
  extern int b_s, b_t, n_s, n_w, sw;

  int i, j;

  for ( i = 0; i < b_t; i++ )
    {
      for ( j = 0; j < n_w; j++ )
        {
          if ( w[j] == i )
            {
              if ( sw == 1 )
                {
                  printf("S ");
                  break;
                }
              else
                {
                  printf("W ");
                  break;
                }
            }
        }
      if ( j == n_w )
        {
          for ( j = 0; j < n_s; j++ )
            {
              if ( s[j] == i )
                {
                  if ( sw == 1 )
                    {
                      printf("W ");
                      break;
                    }
                  else
                    {
                      printf("S ");
                      break;
                    }
                }
            }
          if ( j == n_s )
            printf(". ");
        }

      if ( (i % b_s) == (b_s - 1) )
        printf("\n");
    }
}

void place_wolves(int *s, int *w)
{
  extern int b_t, n_s, n_w;

  int i, j, wc = 0;

  for ( i = 0; i < b_t; i++ )
    {
      for ( j = 0; j < n_s; j++ )
        {
          if ( s[j] == i )
            break;
        }

      if ( j < n_s )
        continue;

      if ( can_place_wolf(s, i) )
        {
          w[wc++] = i;
          if ( wc == n_w )
            {
              print_grid(s, w);
              fflush(stdout);
              exit(0);
            }
        }
    }
}

void move_sheep(int *s)
{
  extern int b_t, n_s;

  int t, r;

  if ( ( (b_s % 2 == 0) && (s[0] > (b_t / 2) + 1) ) ||
       ( (b_s % 2 != 0) && (s[0] > (b_t / 2))     ) )
    {
      printf("Can't do it.\n");
      fflush(stdout);
      exit(0);
    }

  for ( t = 1; t <= n_s; t++ )
    {
      if ( s[n_s - t] < (b_t - t) )
        {
          s[n_s - t]++;
          for ( r = t - 1; r >= 1; r-- )
            {
              s[n_s - r] = s[n_s - r - 1] + 1;
            }
          break;
        }
    }
}

int main(int argc, char **argv)
{
  extern int b_s, b_t, n_s, n_w, sw;

  int *s, *w, t;

  b_s = 5; n_s = 3; n_w = 5;
  b_t = b_s * b_s;
  sw = 0;

  for ( t = 0; t < argc; t++ )
    {
      if      ( strcmp(argv[t], "-s") == 0 )
        {
          n_s = atoi(argv[++t]);
        }
      else if ( strcmp(argv[t], "-w") == 0 )
        {
          n_w = atoi(argv[++t]);
        }
      else if ( strcmp(argv[t], "-b") == 0 )
        {
          b_s = atoi(argv[++t]);
          b_t = b_s * b_s;
        }
      else if ( strcmp(argv[t], "-h") == 0 )
        {
          printf("\n");
          printf("wvs (Wolves versus Sheep)\n\n");
          printf("    -s SheepCount      (default 3)\n");
          printf("    -w WolfCount       (default 5)\n");
          printf("    -b BoardEdgeLength (default 5)\n\n");
          fflush(stdout);
          exit(0);
        }
    }

  if ( n_s > n_w )
    {
      sw = n_w;
      n_w = n_s;
      n_s = sw;
      sw = 1;
    }

  s = (int *)calloc(1, n_s * sizeof(int));
  w = (int *)calloc(1, n_w * sizeof(int));

  if ( n_s == 0 && n_w == 0 )
    {
      print_grid(s, w);
      exit(0);
    }

  for ( t = 0; t < n_s; t++ )
    {
      s[t] = t;
    }

  while (1)
    {
      place_wolves(s, w);
      move_sheep(s);
    }
}
