/******************************************************************************
Welcome to GDB Online.
GDB online is an online compiler and debugger tool for C, C++, Python, Java, PHP, Ruby, Perl,
C#, VB, Swift, Pascal, Fortran, Haskell, Objective-C, Assembly, HTML, CSS, JS, SQLite, Prolog.
Code, Compile, Run and Debug online from anywhere in world.
*******************************************************************************/
#include <stdio.h>
#include <stdlib.h>
int bits;
int c_sum[5],r_sum[5],d_sum[2];
int grid[5][5];
void show_me(){
int c,r;
printf(">!%18d\n>! ",d_sum[1]);
for(r=0;r<5;++r){
for(c=0;c<5;++c)
printf("%2d ",grid[r][c]);
printf("%2d\n>! ",r_sum[r]);
}
for(c=0;c<5;++c)
printf("%2d ",c_sum[c]);
printf("%2d\n\n",d_sum[0]);
}
int valid(int col,int row,int i){
int n,s,e,w;
int ne,se,nw,sw;
if(col>0){
w=abs(grid[row][col-1]-i)>3;
if(row>0)nw=abs(grid[row-1][col-1]-i)>3;
if(row<4)sw=abs(grid[row+1][col-1]-i)>3;
}
if(col<4){
e=abs(grid[row][col+1]-i)>3;
if(row>0)ne=abs(grid[row-1][col+1]-i)>3;
if(row<4)se=abs(grid[row+1][col+1]-i)>3;
}
if(row>0)n=abs(grid[row-1][col]-i)>3;
if(row<4)s=abs(grid[row+1][col]-i)>3;
switch(row){
case 0:
case 4:
switch(col){
case 0: return e;
case 2: return e&w;
case 4: return w;
}
case 1:
case 3:
switch(col){
case 0: return n&s&ne&se;
case 4: return n&s&w&nw&sw;
default: return n&s&w&ne&se&nw&sw;
}
case 2:
switch(col){
case 0: return 1;
case 1: return e&w;
default: return w;
}
}
return 0;
}
void recur(int col, int row){
int i;
for(i=1;i<26;++i){
if(r_sum[row]+i>65)return;
if(c_sum[col]+i>65)return;
if(col==4 && r_sum[row]+i!=65)continue;
if(row==1 && col>2 && c_sum[col]+i!=65)continue;
if(bits&1<<i)continue;
if(valid(col,row,i)==0)continue;
bits^=1<<i;
bits^=1<<(26-i);
grid[row][col]=i;
grid[4-row][4-col]=26-i;
r_sum[row]+=i;
r_sum[4-row]+=26-i;
c_sum[col]+=i;
c_sum[4-col]+=26-i;
if(col==row)d_sum[0]+=26;
if(col+row==4)d_sum[1]+=26;
switch(row){
case 0:
if(col==4)recur(0,2);
else recur(col+2,0);
break;
case 2:
if(col==1)recur(0,1);
else recur(col+1,2);
break;
case 1:
if(col==4)show_me();
else recur(col+1,1);
break;
}
r_sum[row]-=i;
r_sum[4-row]-=26-i;
c_sum[col]-=i;
c_sum[4-col]-=26-i;
if(col==row)d_sum[0]-=26;
if(col+row==4)d_sum[1]-=26;
bits^=1<<i;
bits^=1<<(26-i);
}
}
int main()
{
grid[0][1]=10;
grid[0][3]=12;
grid[2][2]=13;
grid[4][1]=14;
grid[4][3]=16;
bits=93<<10;
r_sum[0]=22;
r_sum[2]=13;
r_sum[4]=30;
c_sum[1]=24;
c_sum[2]=13;
c_sum[3]=28;
d_sum[0]=13;
d_sum[1]=13;
recur(0,0);
return 0;
}