#include <stdio.h>
#include <stdlib.h>
#include <string.h>

void afficheMat(int N, int t[N][N]) {

  int i,j;

  for(i=0;i<N;i++){
		for(j=0;j<N;j++){
			printf("| %d ",t[i][j]);
		}
		printf("|\n");
	}

}

int sommeLigne(int N, int c[N][N]) {

	int i,egal,res;

	egal = 1;
	res = sommeUneLigne(0,N,c);
	for (i = 0; i < N; i++)
	{
	  egal = (egal == 1) && (res == sommeUneLigne(i,N,c));
	}
		return egal;
}

int sommeUneLigne(int i, int N, int c[N][N]) {

	int j,res;
	
	res=0;
	for (j = 0; j < N; j++)
	{
	  res += c[i][j];
	}
	return res;
}

int sommeColonne(int N, int c[N][N]) {

	int i,egal,res;

	egal = 1;
	res = sommeUneColonne(0,N,c);
	for (i = 0; i < N; i++)
	{
	  egal = (egal == 1) && (res == sommeUneColonne(i,N,c));
	}
	return egal;
}

int sommeUneColonne(int j, int N, int c[N][N]) {

	int i,res;
	
	res=0;
	for (i = 0; i < N; i++)
	{
	  res += c[i][j];
	}
	return res;
}


int sommeDiagGD(int N, int c[N][N]) {

	int i,res;
	
	res=0;
	for (i = 0; i < N; i++)
	{
	  res += c[i][i];
	}
	return res;
}

int sommeDiagDG(int N, int c[N][N]) {

	int i,res;
	
	res=0;
	for (i = 0; i < N; i++)
	{
	  res += c[i][N-i-1];
	}
	return res;
}

int sommeDiag(int N, int c[N][N]) {

	return (sommeDiagDG(N,c) == sommeDiagGD(N,c));
}

int estMagique(int N, int c[N][N]) {
	
	return ((sommeLigne(N,c) == 1) && (sommeColonne(N,c) == 1) && (sommeDiag(N,c) == 1));
	
}

int main(int argc, char** argv){

	int carre1[3][3] = {{8,1,6},{3,5,7},{4,9,2}};
	int carre2[3][3] = {{3,8,4},{7,2,6},{9,1,5}};

	afficheMat(3, carre1);
  printf(" %s magique\n",((estMagique(3,carre1)==1)?"est":"n'est pas"));
	afficheMat(3, carre2);
  printf(" %s magique\n",((estMagique(3,carre2)==1)?"est":"n'est pas"));

	return (EXIT_SUCCESS);
}
