#include<fstream>
#include<cstring>
using namespace std;
ifstream f("date.in");
ofstream g("date.out");
int n,p[100],a[10][10],s,gata;
void afis()
{
int i,j;
for(i=1;i<=n;i++)
{
for(j=1;j<=n;j++)
g<<a[i][j]<<" ";
g<<endl;
}
g<<endl;
gata=1;
}
int sumap(int i,int j)
{
int s=0,k;
for(k=1;k<=j;k++) s=s+a[i][k];
return s;
}
int sumal(int i)
{
int s=0,j;
for(j=1;j<=n;j++) s=s+a[i][j];
return s;
}
int sumac(int j)
{
int s=0,i;
for(i=1;i<=n;i++) s=s+a[i][j];
return s;
}
int sumad2()
{
int s=0,i;
for(i=1;i<=n;i++) s=s+a[i][n+1-i];
return s;
}
int sumad1()
{
int s=0,i;
for(i=1;i<=n;i++) s=s+a[i][i];
return s;
}
int bun(int i, int j)
{
if(sumap(i,j)>s) return 0;
if(j==n) if(sumal(i)!=s) return 0;
if(i==n) if(sumac(j)!=s) return 0;
if(i==n && j==1) if(sumad2()!=s) return 0;
if(i==n && j==n) if(sumad1()!=s) return 0;
return 1;
}
void back(int i, int j)
{
if(!gata)
for(int v=1;v<=n*n;v++)
if(!p[v])
{
a[i][j]=v;
p[v]=1;
if(bun(i,j)) if(i==n&&j==n) afis();
else if(j<n) back(i,j+1);
else back(i+1,1);
p[v]=0;
}
}
int main()
{
f>>n;
s=n*(n*n+1)/2;
gata=0;
back(1,1);
return 0;
}
|