Skip to the page content area.

:::

Tavern Diary Volume 156


2.3.’10. 8:10am.

The Recursive Version of the Magic Square Function

From exercise 8 of Chapter 1.4.3 in Fundamentals of Data Structures in C.

/* Filename:    exer-1.4.3-8.c
   Description: A recursive version of the magic square program (Program 1.22)
   Source:      Exercise 8 of 1.4.3 from Fundamentals of Data Structures in C
   Version:     1.0.0
   Author:      imacat <imacat@mail.imacat.idv.tw>
   Date:        2010-02-03
   Copyright:   (c) 2010 imacat */

/* Headers */
#include <stdio.h>
#include <stdlib.h>

/* Configuration */
#define MAX_SIZE  15

/* Prototypes */
void *xmalloc (size_t size);
void gen_magic_square (int **square, int size, int *i, int *j, int index);

/* Main program */
int
main (int argc, char *argv[])
{
  int **square;
  int size, i, j;

  while (1) {
    printf ("Enter the size of the square: ");
    scanf ("%d", &size);
    if (size < 1 && size > MAX_SIZE + 1) {
      fprintf (stderr, "Please input a size between 1 and %d.\n", MAX_SIZE);
    } else if (size % 2 == 0) {
      fprintf (stderr, "Please input an odd size.\n");
    } else {
      break;
    }
  }

  /* Initialize the square */
  square = (int **) xmalloc (sizeof (int *) * size);
  for (i = 0; i < size; i++) {
    square[i] = (int *) xmalloc (sizeof (int) * size);
    for (j = 0; j < size; j++) {
      square[i][j] = 0;
    }
  }

  i = 0;
  j = (size - 1) / 2;
  gen_magic_square (square, size, &i, &j, size * size);

  /* Output the magic square */
  printf ("Magic Squre of size %d:\n\n", size);
  for (i = 0; i < size; i++) {
    for (j = 0; j < size; j++) {
      printf ("%5d", square[i][j]);
    }
    printf ("\n");
  }
  printf ("\n");
  return 0;
}

/* xmalloc: malloc() and handles the error.
     return: the pointer. */
void *
xmalloc (size_t size)
{
  void *p;

  p = malloc (size);
  if (p == NULL) {
    fprintf (stderr, "Failed allocate %ld bytes memory.\n", size);
    exit (1);
  }
  return p;
}

/* gen_magic_square: Generate the magic square.
     return: none. */
void
gen_magic_square (int **square, int size, int *i, int *j, int count)
{
  int i1, j1;

  if (count == 1) {
    square[*i][*j] = count;
    return;
  }

  /* Get into the next number */
  gen_magic_square (square, size, i, j, count  - 1);

  i1 = (*i > 0)? *i - 1: size - 1;
  j1 = (*j > 0)? *j - 1: size - 1;
  if (square[i1][j1] != 0) {
    j1 = *j;
    i1 = *i + 1;
    if (i1 >= size) {
      i1 = 0;
    }
  }
  *i = i1;
  *j = j1;
  square[*i][*j] = count;
  return;
}

Index | First | Previous | 154 | 155 | 156 | 157 | 158 | Next | Last