#include <stdio.h>

/*-------------------------------*/

#define DEBUG  0
#define SIZE   6

/*-------------------------------*/

int m[SIZE][SIZE][2];
int u[SIZE][SIZE];
long int c, cc;

int find_cell(int x, int y);
int advance(int *x, int *y);

void main(void) {
  extern int m[SIZE][SIZE][2];
  extern int u[SIZE][SIZE];
  extern long int c, cc;

  int i, j, k;

  c = cc = 0;

  /* Initialize the used table. */
  for (i=0;i<SIZE;i++)
    for (j=0;j<SIZE;j++)
      u[i][j] = 0;

  /* Initialize the first (SIZE + 1) cells. */
  for (j=0;j<SIZE;j++)
    {
      for (k=0;k<2;k++)
        m[0][j][k] = j;
      u[j][j] = 1;
    }

  m[1][0][0] = 1;
  m[1][0][1] = 2;
  u[1][2] = 1;

  /* Start 'er up. */
  if (find_cell(1, 1))
    {
      for (i=0;i<SIZE;i++)
        {
          printf("\n");
          for (j=0;j<SIZE;j++)
            {
              printf(" ");
              for (k=0;k<2;k++)
                {
                  if (k==1)
                    printf("");
                  printf("%i", m[i][j][k]);
                }
            }
        }
      printf("\n\n");
    }
  else
    printf("\n\n----====> Can't be done.\n");
}

int find_cell(int x, int y)
{
  extern int m[SIZE][SIZE][2];
  extern int u[SIZE][SIZE];
  extern long int c, cc;

  int i, j;
  int a = 0;
  int b = 0;

  /* Try combos... */
  while (1)
    {

      /* Print ever iteration if debugging, otherwise
         print every 10 millionth. */
      if (DEBUG || ++c % 10000000 == 0)
        {
          c = 0;
          printf("[%i] (%i%i)", ++cc, x, y);
          for (i = 1; i < SIZE; i++)
            {
              printf(" %i%i", m[1][i][0], m[1][i][1]);
            }
          printf("\n");
          fflush(stdout);
        }

      if (u[a][b])
        {
          if (DEBUG)
            printf("    **Conflict: (%i%i) has been used.\n", a, b);

          if (!(advance(&a, &b)))
            return 0;
          continue;
        }

      for (i=0;i<x;i++)
        if (m[i][y][0] == a ||
            m[i][y][1] == b)
          {
            if (DEBUG)
              printf("    **Conflict: (in col) (%i,%i) = (%i%i)**\n", i, y, m[i][y][0], m[i][y][1]);

            /* If the first parms is the prob, skip to the end of it. */
            if (m[i][y][0] == a)
              b = SIZE - 1;

            if (!(advance(&a, &b)))
              return 0;
            break;
          }
      if (i != x)
        continue;

      for (i=0;i<y;i++)
        if (m[x][i][0] == a ||
            m[x][i][1] == b)
          {
            if (DEBUG)
              printf("    **Conflict: (in row) (%i,%i) = (%i%i)**\n", x, i, m[x][i][0], m[x][i][1]);

            /* If the first parms is the prob, skip to the end of it. */
            if (m[x][i][0] == a)
              b = SIZE - 1;

            if (!(advance(&a, &b)))
              return 0;
            break;
          }
      if (i != y)
        continue;

      if (DEBUG)
        printf("++(%i,%i) = (%i%i)++\n", x, y, a, b);

      i = x; j = y;
      u[a][b] = 1;
      m[x][y][0] = a;
      m[x][y][1] = b;
      if (!(advance(&i, &j)) || find_cell(i, j))
        return 1;

      if (DEBUG)
        printf("--(%i,%i) = (%i%i)--\n", x, y, a, b);

      u[a][b] = 0;
      if (!(advance(&a, &b)))
        return 0;
      continue;
    }
}

int advance(int *x, int *y)
{
  if (++(*y) == SIZE)
    {
      if (++(*x) == SIZE)
        return 0;
      (*y) = 0;
    }

  return 1;
}
