Programa para verificar um quadrado mágico 8x8, solução incompleta (falta verificar a unicidade dos elementos).

 

#include <stdio.h>
#include <stdlib.h>
#define TRUE 1
#define FALSE 0
#define N 8
#define CM N*(N*N+1)/2

int QMvalido(int q[][8]){
  int i,j;
  int acum;
  for(i=0; i<8; i++){
    acum=0;
    for(j=0; j<8; j++)
      acum+=q[i][j];
    if(acum!=CM){
      printf("Linha %d não totaliza %d\n", i, CM);
      return FALSE;
    }
    acum=0;
    for(j=0; j<8; j++)
      acum+=q[j][i];
    if(acum!=CM){
      printf("Coluna %d não totaliza %d\n", i, CM);
      return FALSE;
    }
  }
  acum=0;
  for(i=0; i<8; i++)
    acum+=q[i][i];
  if(acum!=CM){
    printf("Diagonal Principal não totaliza %d\n",CM);
    return FALSE;
  }
  acum=0;
  for(i=0; i<8; i++)
    acum+=q[i][7-i];
  if(acum!=CM){
    printf("Diagonal secundaria não totaliza %d\n", CM);
    return FALSE;
  }
  return TRUE;
}
int main(int argc, char *argv[])
{
  int qm[8][8]={{64, 2, 3,61,60, 6, 7,57},
                { 9,55,54,12,13,51,50,16},
                {17,47,46,20,21,43,42,24},
                {40,26,27,37,36,30,31,33},
                {32,34,35,29,28,38,39,25},
                {41,23,22,44,45,19,18,48},
                {49,15,14,52,53,11,10,56},
                { 8,58,59, 5, 4,62,63, 1}};
  if(QMvalido(qm))printf("Quadrado magico ok!\n");
  system("PAUSE");
  return 0;
}