allocate mem(2^30) W = 141 T = matrix(W,W, i,j, -1) hori = vector(W) vert = vector(W) dia1 = vector(2*W+1) dia2 = vector(2*W+1) get(z) = { if (real(z)<1 || real(z)>W || imag(z)<1 || imag(z)>W, return (-1), return (T[real(z),imag(z)]); ); } { n=0; for (d=1, W, for (x=1, d, y=d+1-x; z=x+I*y; my (h=imag(z), w=real(z), d1=real(z)+imag(z)-1, d2=real(z)-imag(z)+W, seen=bitor(bitor(hori[h], vert[w]), bitor(dia1[d1], dia2[d2]))); \\ 8 knight moves for (k=0, 7, my (kz = z + (2+I*(-1)^(k%2)) * I^(k\2), o=get(kz)); if (o>=0, seen = bitor(seen, 2^o); ); ); my (v=valuation(seen+1,2)); hori[h] += 2^v; vert[w] += 2^v; dia1[d1] += 2^v; dia2[d2] += 2^v; T[x,y] = v; print (n++-1 " " v); ); ); } quit