ほらよ。完璧。

#include <stdio.h>
#define SQ 3 //一辺
#define COUNT SQ*SQ

int flag=0xFFFF,x[COUNT];

void foo(int d){
 int i,j,a,b;
 if (d==COUNT){
 for ( i=a=0; i<SQ; i++) a+=x[i];
 for ( i=b=0; i<SQ; i++) b+=x[i*(SQ+1)]; if (b!=a)return;
 for ( i=b=0; i<SQ; i++) b+=x[(SQ-1)*(1+i)];if (b!=a)return;

 for ( j=0; j<SQ; j++){
  for( i=b=0; i<SQ; i++) b+=x[i+SQ*j]; if(b!=a)return;
  for( i=b=0; i<SQ; i++) b+=x[i*SQ+j]; if(b!=a)return;
 }

 for (i=0;i<COUNT;i++)
 {
  printf("%d",x[i]);
  if (i%SQ==SQ-1) printf(" ");
 }
 printf("\n");
 return;
}
for (i=0;i<COUNT;i++)
 if (flag & (1<<i) ){
  flag &= ~( 1<<i );
   x[d]=i;
   foo(d+1);
   flag |= (1<<i);
  }
}

void main(){
 foo(0);
}