/* * */ #include #include #define N 16 int square[N*N]; int dirs[8][2]={ {-1,-2}, {1,-2}, {-2,-1}, {2,-1}, {-2,1}, {2,1}, {-1,2}, {1,2}, }; int ComputeJumps() { int x, y, n; int d; int x2, y2; int s; // first, we verify if it is magic ! for (y = 0;y < N;++y) { s = 0; for (x = 0;x < N;++x) { s += square[y*N+x]; } if (s != N*(N*N-1)/2) { return 0; } } for (x = 0;x < N;++x) { s = 0; for (y = 0;y < N;++y) { s += square[y*N+x]; } if (s != N*(N*N-1)/2) { return 0; } } // is it pandiagonal ? #if 0 for (d = 0;d < N;++d) { int s1, s2; s1 = s2 = 0; for (x = 0;x < N;++x) { y = (x+d)%N; s1 += square[y*N+x]; } if (s1 != N*(N*N-1)/2) { return 0; } for (x = 0;x < N;++x) { y = (x+d)%N; s2 += square[y*N+N-1-x]; } if (s2 != N*(N*N-1)/2) { return 0; } } #endif x = 0; y = 0; n = 1; cont: for (d = 0; d < 8;++d) { x2 = x + dirs[d][0]; y2 = y + dirs[d][1]; if (x2 < 0) x2 += N; if (x2 >= N) x2 -= N; if (y2 < 0) y2 += N; if (y2 >= N) y2 -= N; if (square[y2*N+x2] == n) { ++n; x = x2; y = y2; goto cont; } } return n; } int main(void) { FILE *out; char filename[256]; int dx, dy; int x, y; int count; int COEF1, COEF2, COEF3, COEF4; int record = N*N; int n; for (COEF1=0;COEF1= N) dx=dx-N; dy = dy+COEF2; if (dy < 0) dy=dy+N; if (dy >= N) dy=dy-N; } dx = dx+COEF3; if (dx < 0) dx=dx+N; if (dx >= N) dx=dx-N; dy = dy+COEF4; if (dy < 0) dy=dy+N; if (dy >= N) dy=dy-N; } // now, we check that the knight jumps are consecutive n = ComputeJumps(); if (n >= record) { record = n; printf("%d: %d %d %d %d\n", record, COEF1, COEF2, COEF3, COEF4); sprintf(filename, "MAGIC%d.TXT", N); out = fopen(filename, "at"); fprintf(out, "%d %d %d %d\n", COEF1, COEF2, COEF3, COEF4); fclose(out); for (y = 0;y < N;++y) { for (x = 0;x < N;++x) { printf("%d ", square[y*N+x]); } printf("\n"); } } } } } } return 0; }